实序例快速傅里叶变换 Real Sequence Fast Fourier Transform

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Numerics;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using static System.Net.WebRequestMethods;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Real_Sequence_FFT
{
    public partial class Real_Sequence_FFTForm : Form
    {
        static double[] result = new double[64];
        public Real_Sequence_FFTForm()
        {
            InitializeComponent();
           
        }
        
       
        /************************************
        * x(i) = 0.0, i= 0,.....9
        * x(i) = exp^(-(i-10)/15)*sin(2π(i-10)/16)
        * n=64,
        ************************************/
        private void btTransform_Click(object sender, EventArgs e)
        {
            int i, n, j;
            n = 64;
            rbPointData.Clear();            
            rbTransformData.Clear();            
            foreach (var series in chart1.Series)
            {
                series.Points.Clear();
            }
            foreach (var series in chart2.Series)
            {
                series.Points.Clear();
            }
            foreach (var series in chart3.Series)
            {
                series.Points.Clear();
            }
            for ( int r = 0; r < n; r++)//clear residual data
            {
                img[r] = 0.0;
                real[r] = 0.0;
            }
            for (i = 0; i < 10; i++)   //real sequence's front 10 data -> 0.0
            {
               real[i] = 0.0;
            }
            for (i = 10; i < n; i++) // real sequence's behind data
            {
                real[i] = Math.Exp(-(i - 10) / 15.0) * Math.Sin(6.2831853 * (i - 10) / 16.0);
                img[i] = 0.0;
            }
            Complex[] cx = new Complex[n];  //saving Oringinal Sequence for Complex FFT
            for (i = 0; i < n; i++)
            {
                cx[i] = new Complex(real[i], img[i]);
            }

            rbPointData.AppendText("\n Real Number Input Sequence \n");
            for (i = 0; i < n / 4; i++)
            {
                for (j = 0; j < 4; j++)
                    rbPointData.AppendText(real[4 * i + j].ToString("f6") + "   \t");
                rbPointData.AppendText("\n");
            }
            for (i = 0; i < n; i++)
            {
                this.chart1.Series[0].Points.AddXY(real[i], img[i]);
            }
            
            rfft(real, n);
            rbPointData.AppendText("\n Real Sequence Discrete Fourier Transform:\n");
            for (i = 0; i < n / 2; i++)
            {
                for (j = 0; j < 2; j++)
                    if (img[2 * i + j] < 0)
                        if (real[2 * i + j] < 0)
                            rbPointData.AppendText("\t"+real[2 * i + j].ToString("f6") + "  -J " + Math.Abs(img[2 * i + j]).ToString("f6"));
                        else
                            rbPointData.AppendText("\t " + real[2 * i + j].ToString("f6") + "  -J " + Math.Abs(img[2 * i + j]).ToString("f6"));
                    else
                        if (real[2 * i + j] < 0)
                            rbPointData.AppendText("\t"+real[2 * i + j].ToString("f6") + "   J " + Math.Abs(img[2 * i + j]).ToString("f6"));
                        else
                            rbPointData.AppendText("\t " + real[2 * i + j].ToString("f6") + "   J " + Math.Abs(img[2 * i + j]).ToString("f6"));
            }

            for (i = 0; i < n; i++)
            {
                this.chart1.Series[1].Points.AddXY(real[i], img[i]);
            }
            irfft(result, n);
            rbPointData.AppendText("\n Inverse Discrete Fourier Transform \n");
            for (i = 0; i < n; i += 4)
            {
                rbPointData.AppendText("\t" + result[i].ToString("f6") + "\t" + result[i + 1].ToString("f6"));
                rbPointData.AppendText("\t" + result[i + 2].ToString("f6") + "\t" + result[i + 3].ToString("f6"));
                rbPointData.AppendText("\n");
            }
            for (i = 0; i < n; i++)
            {
                this.chart2.Series[0].Points.AddXY(result[i], 0.0);
            }

            /*********************************************
             * Complex 
             ********************************************/
            Complex[] FFT_output = FFT(cx);
            rbTransformData.AppendText("Complex Fast Fourier Tansform:  \n");
            for (i = 0; i < n/2; i++)
            {
                for (j = 0; j < 2; j++)
                {
                    this.chart3.Series[0].Points.AddXY(FFT_output[2*i+j].Real, FFT_output[2*i+j].Imaginary);
                    rbTransformData.AppendText("\t"+FFT_output[2*i+j].Real.ToString("f6") +"\t  J " + FFT_output[2*i+j].Imaginary.ToString("f6") );
                }
                rbTransformData.AppendText("\n");
            }
            Complex[] IFFT_output = IFFT(FFT_output);
            rbTransformData.AppendText("Complex Inverse Fsat Fourier Transform: \n");
            for (i = 0; i < n / 4; i++)
            {
                for (j = 0; j < 4; j++)
                {
                    this.chart3.Series[1].Points.AddXY(IFFT_output[4 * i + j].Real, IFFT_output[4 * i + j].Imaginary);
                    rbTransformData.AppendText("\t"+IFFT_output[4 * i + j].Real.ToString("f6"));
                }
                rbTransformData.AppendText("\n");
            }
        }
        private void btToChange_Click(object sender, EventArgs e)
        {
            if(btToChange.Text == "To Complex IRFFT")
            {
                btToChange.Text = "To Real irfft";
                chart2.Visible = false;
                chart3.Visible = true;
            }
            else
            {
                btToChange.Text = "To Complex IRFFT";
                chart2.Visible = true;
                chart3.Visible = false;
            }
        }
    }
}

实序例快速傅里叶变换,RealSequenceFastFourierTransform资源-CSDN文库

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值