⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 VS2005开发的
💻 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 + -