📄 form1.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FFT运算PPC版
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ShowData dataset = new ShowData();
ShortData shortset = new ShortData();
int x1, x2, x3, x4, t1, t2, t3, t4, y;
int MAX;
float[] dataI;
float[] dataR;
private String ConvertBin(int date, int n)
{
int i;
String Rstring = "";
for (i = n - 1; i >= 0; i--)
{
if ((date / (1 << i)) == 1)
Rstring += "1";
else
Rstring += "0";
date %= (1 << i);
}
return Rstring;
}
private void Form1_Load(object sender, EventArgs e)
{
this.排序menuItem.Enabled = false;
this.运算menuItem.Enabled = false;
/*
float[] xx = new float[100];
float[] yy = new float[100];
for (int k = 0; k < 100; k++)
{
xx[k] = k;
yy[k] = k * k;
}
C1.Win.C1Chart.ChartDataSeries series = this.c1Chart1.ChartGroups[0].ChartData.SeriesList.AddNewSeries();
series.X.CopyDataIn(xx);
series.Y.CopyDataIn(yy);
*/
}
private void 生成menuItem_Click(object sender, EventArgs e)
{
this.生成menuItem.Text = "生成中";
dataset.数据.Clear();
shortset.数据.Clear();
x1 = Convert.ToInt32(this.系数一numericUpDown.Value);
x2 = Convert.ToInt32(this.系数二numericUpDown.Value);
x3 = Convert.ToInt32(this.系数三numericUpDown.Value);
x4 = Convert.ToInt32(this.系数四numericUpDown.Value);
t1 = Convert.ToInt32(this.周期一numericUpDown.Value);
t2 = Convert.ToInt32(this.周期二numericUpDown.Value);
t3 = Convert.ToInt32(this.周期三numericUpDown.Value);
t4 = Convert.ToInt32(this.周期四numericUpDown.Value);
y = Convert.ToInt32(this.指数numericUpDown.Value);
MAX = Convert.ToInt32(Math.Pow(2, y));
dataI = new float[MAX];
dataR = new float[MAX];
float[] number = new float[MAX];
for (int i = 0; i < MAX; i++)
{
dataR[i] = 0;
if (this.系数一comboBox.Text == "正弦波")
{
dataR[i] += Convert.ToSingle(x1 * Math.Sin(2 * t1 * Math.PI * i / MAX));
}
else if (this.系数一comboBox.Text == "余弦波")
{
dataR[i] += Convert.ToSingle(x1 * Math.Cos(2 * t1 * Math.PI * i / MAX));
}
else if (this.系数一comboBox.Text == "三角波")
{
if (i % (MAX / t1) < (MAX / 2 / t1))
dataR[i] += Convert.ToSingle(-x1 + Convert.ToSingle(4 * x1 * t1 * (i % (MAX / t1))) / MAX);
else
dataR[i] += Convert.ToSingle(x1 - Convert.ToSingle(4 * x1 * t1 * (i % (MAX / t1) - (MAX / 2 / t1))) / MAX);
}
else if (this.系数一comboBox.Text == "方波")
{
if (i % (MAX / t1) < (MAX / 2 / t1))
dataR[i] += x1;
else
dataR[i] += -x1;
}
if (this.系数二comboBox.Text == "正弦波")
{
dataR[i] += Convert.ToSingle(x2 * Math.Sin(2 * t2 * Math.PI * i / MAX));
}
else if (this.系数二comboBox.Text == "余弦波")
{
dataR[i] += Convert.ToSingle(x2 * Math.Cos(2 * t2 * Math.PI * i / MAX));
}
else if (this.系数二comboBox.Text == "三角波")
{
if (i % (MAX / t2) < (MAX / 2 / t2))
dataR[i] += Convert.ToSingle(-x2 + Convert.ToSingle(4 * x2 * t2 * (i % (MAX / t2))) / MAX);
else
dataR[i] += Convert.ToSingle(x2 - Convert.ToSingle(4 * x2 * t2 * (i % (MAX / t2) - (MAX / 2 / t2))) / MAX);
}
else if (this.系数二comboBox.Text == "方波")
{
if (i % (MAX / t2) < (MAX / 2 / t2))
dataR[i] += x2;
else
dataR[i] += -x2;
}
if (this.系数三comboBox.Text == "正弦波")
{
dataR[i] += Convert.ToSingle(x3 * Math.Sin(2 * t3 * Math.PI * i / MAX));
}
else if (this.系数三comboBox.Text == "余弦波")
{
dataR[i] += Convert.ToSingle(x3 * Math.Cos(2 * t3 * Math.PI * i / MAX));
}
else if (this.系数三comboBox.Text == "三角波")
{
if (i % (MAX / t3) < (MAX / 2 / t3))
dataR[i] += Convert.ToSingle(-x3 + Convert.ToSingle(4 * x3 * t3 * (i % (MAX / t3))) / MAX);
else
dataR[i] += Convert.ToSingle(x3 - Convert.ToSingle(2 * x3 * t3 * (i % (MAX / t3) - (MAX / 2 / t3))) / MAX);
}
else if (this.系数三comboBox.Text == "方波")
{
if (i % (MAX / t3) < (MAX / 2 / t3))
dataR[i] += x3;
else
dataR[i] += -x3;
}
if (this.系数四comboBox.Text == "正弦波")
{
dataR[i] += Convert.ToSingle(x4 * Math.Sin(2 * t4 * Math.PI * i / MAX));
}
else if (this.系数四comboBox.Text == "余弦波")
{
dataR[i] += Convert.ToSingle(x4 * Math.Sin(2 * t4 * Math.PI * i / MAX));
}
else if (this.系数四comboBox.Text == "三角波")
{
if (i % (MAX / t4) < (MAX / 2 / t4))
dataR[i] += Convert.ToSingle(-x4 + Convert.ToSingle(4 * x4 * t4 * (i % (MAX / t4))) / MAX);
else
dataR[i] += Convert.ToSingle(x4 - Convert.ToSingle(2 * x4 * t4 * (i % (MAX / t4) - (MAX / 2 / t4))) / MAX);
}
else if (this.系数四comboBox.Text == "方波")
{
if (i % (MAX / t4) < (MAX / 2 / t4))
dataR[i] += x4;
else
dataR[i] += -x4;
}
DataRow datarow = dataset.数据.NewRow();
datarow["序号前"] = i.ToString();
datarow["转换前序号"] = ConvertBin(i, y);
datarow["转换前数据"] = dataR[i].ToString("0.000");
dataset.数据.Rows.Add(datarow);
}
this.dataGrid1.DataSource = dataset.数据;
this.生成menuItem.Text = "生成";
this.排序menuItem.Enabled = true;
}
private void 排序menuItem_Click(object sender, EventArgs e)
{
int i, j;
int tmp;
int[] x = new int[y];
/********** following code invert sequence ************/
for (i = 0; i < MAX; i++)//循环count[n]次
{
tmp = 0;
for (j = 0; j < y; j++)//x[0]~x[n]赋值为0
x[j] = 0;
for (j = 0; j < y; j++)
{
x[j] = (i / (1 << j)) & 0x01;
}
for (j = 0; j < y; j++)
{
tmp = tmp + x[j] * (1 << (y - j - 1));
}
dataI[tmp] = dataR[i];
DataRow datarow = dataset.数据.Rows[i];
datarow["转换后序号"] = ConvertBin(tmp, y);
datarow["转换后数据"] = dataR[tmp].ToString("0.000");
datarow["序号后"] = tmp.ToString();
}
for (i = 0; i < MAX; i++)
{
dataR[i] = dataI[i];
dataI[i] = 0;
}
this.运算menuItem.Enabled = true;
}
private void 运算menuItem_Click(object sender, EventArgs e)
{
int i,L,j,k,b,p,qq;
float TR,TI,temp;
/************** following code FFT *******************/
for (L = 1; L <= y; L++)
{ /* for(1) */
b = 1; i = L - 1;
while (i > 0)
{
b = b << 1;
i--;
} /* b= 2^(L-1) */
for (j = 0; j <= b - 1; j++) /* for (2) */
{
p = 1;
i = y - L;
while (i > 0) /* p=pow(2,7-L)*j; */
{
p = p << 1;
i--;
}
p = p * j;
for (k = j; k < MAX; k = k + 2 * b) /* for (3) */
{
TR = dataR[k];
TI = dataI[k];
temp = dataR[k + b];
//QQ=2*pi*p/count[n];
qq = p;// (int)(p * Math.Pow(2, (y - k)));
//////////////////////////////查表/////////////////////////////////////
dataR[k] = dataR[k] + dataR[k + b] * Convert.ToSingle(Math.Cos(2 * Convert.ToSingle(Math.PI) * qq / (1 << y))) + dataI[k + b] * Convert.ToSingle(Math.Sin(2 * Convert.ToSingle(Math.PI) * qq / (1 << y)));
dataI[k] = dataI[k] - dataR[k + b] * Convert.ToSingle(Math.Sin(2 * Convert.ToSingle(Math.PI) * qq / (1 << y))) + dataI[k + b] * Convert.ToSingle(Math.Cos(2 * Convert.ToSingle(Math.PI) * qq / (1 << y)));
dataR[k + b] = TR - dataR[k + b] * Convert.ToSingle(Math.Cos(2 * Convert.ToSingle(Math.PI) * qq / (1 << y))) - dataI[k + b] * Convert.ToSingle(Math.Sin(2 * Convert.ToSingle(Math.PI) * qq / (1 << y)));
dataI[k + b] = TI + temp * Convert.ToSingle(Math.Sin(2 * Convert.ToSingle(Math.PI) * qq / (1 << y))) - dataI[k + b] * Convert.ToSingle(Math.Cos(2 * Convert.ToSingle(Math.PI) * qq / (1 << y)));
////////////////////////////////////////////////////////////////
} /* END for (3) */
} /* END for (2) */
}
for (i = 0; i < MAX; i++)
{
dataR[i] = Convert.ToSingle(Math.Sqrt(dataR[i] * dataR[i] + dataI[i] * dataI[i]));
dataR[i] = dataR[i] / 2/MAX;
}
dataR[0] = dataR[0] / 2;
for (i = 0; i < MAX; i++)
{
DataRow datarow = dataset.数据.Rows[i];
datarow["结果"] = dataR[i].ToString("0.000");
}
this.排序menuItem.Enabled = false;
for (i = 0; i < MAX; i++)
{
dataI[i] = Convert.ToSingle(i);
}
this.c1Chart1.ChartGroups[0].ChartData.SeriesList.Clear();
C1.Win.C1Chart.ChartDataSeries series = this.c1Chart1.ChartGroups[0].ChartData.SeriesList.AddNewSeries();
series.X.CopyDataIn(dataI);
series.Y.CopyDataIn(dataR);
}
private void 退出menuItem_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -