离散傅里叶变换 Discrete Fourier Transform

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Discrete_Fourier_Transform
{
    public partial class DFTForm : Form
    {
        public DFTForm()
        {
            InitializeComponent();
        }
        /*********************************
         * x,y input Array, a, b ouput Array
         * n Data Length
         * sign = 1 => DFT; sign = -1 => IDFT
         */
        void dft(double[] x, double[] y, double[] a, double[] b, int n, int sign)
        { 
	        int i, k;
            double c, d, q, w, s;
            q = 6.28318530718 / n;
	        for (k = 0; k<n; k++)
	        {
		        w = k * q; // k*2π/n
                a[k] = b[k] = 0.0;
                for (i = 0; i < n; i++)
                {
                    d = i * w; // i*2kπ/n
                    c = Math.Cos(d);
                    s = Math.Sin(d) * sign;
                    a[k] += c * x[i] + s * y[i]; //x(i)*cos(i*2kπ/n) + y[i]*sin(i*2kπ/n)
                    b[k] += c * y[i] - s * x[i]; //y(i)*cos(i*2kπ/n) - x[i]*sin(i*2kπ/n)
                }
            
            }
            if (sign == -1)
            {
                c = 1.0 / n;
                for (k = 0; k < n; k++)
                {
                    a[k] = c * a[k];
                    b[k] = c * b[k];
                }
            }
        }
        /************************************
        * x(i) = Qⁱ, i= 0,.....n-1
        * DFT  X(k) = (1-Qⁿ)/(1-QWᵏ)  k= 0,......n-1, W = e^(-j2π/n)
        * Q = 0.9 + j 0.3 
        * n=32,
        ************************************/
        private void btTransform_Click(object sender, EventArgs e)
        {
            int i, j, n;
            double a1, a2, c, c1, c2, d1, d2, q1, q2, w, w1, w2;
            double[] x = new double[32];
            double[] y = new double[32];
            double[] a = new double[32];
            double[] b = new double[32];
            n = 32;
            a1 = 0.9;
            a2 = 0.3;
            x[0] = 1.0;
            y[0] = 0.0;
            for (i = 1; i < n; i++)
            {
                x[i] = a1 * x[i - 1] - a2 * y[i - 1];
                y[i] = a2 * x[i - 1] + a1 * y[i - 1];
            }
            rbPointData.AppendText("\n Original Sequence \n");
            for (i = 0; i < n / 2; i++)
            {
                for (j = 0; j < 2; j++)
                    rbPointData.AppendText(x[2 * i + j].ToString("f6") + "  "+"J " + y[2 * i + j].ToString("f6") + "    ");               
                    rbPointData.AppendText("\n");
            }
            for(i=0; i < n  ;i++)
            {
                this.chart1.Series[0].Points.AddXY(x[i], y[i]);
            }
            q1 = x[n - 1];
            q2 = y[n - 1];
            dft(x, y, a, b, n, 1);
            rbPointData.AppendText("\n Discrete Fourier Transform\n");
            for (i = 0; i < n / 2; i++)
            {
                for (j = 0; j < 2; j++)
                rbPointData.AppendText(a[2 * i + j].ToString("f6")+" J \t"+b[2 * i + j].ToString("f6")+"    \t");
                rbPointData.AppendText("\n");
            }
            for (i = 0; i < n; i++)
            {
                this.chart1.Series[1].Points.AddXY(a[i], b[i]);
            }


            for (i = 0; i < n; i++)
            {
                w = 6.28318530718 / n * i;
                w1 = Math.Cos(w);
                w2 = -Math.Sin(w);
                c1 = 1.0 - a1 * w1 + a2 * w2;
                c2 = a1 * w2 + a2 * w1;
                c = c1 * c1 + c2 * c2;
                d1 = 1.0 - a1 * q1 + a2 * q2;
                d2 = a1 * q2 + a2 * q1;
                x[i] = (c1 * d1 + c2 * d2) / c;
                y[i] = (c2 * d1 - c1 * d2) / c;
            }
            rbTransformData.AppendText("\n Theoretical Discrete Fourier Transform  \n");
            for (i = 0; i < n / 2; i++)
            {
                for (j = 0; j < 2; j++)
                    rbTransformData.AppendText(x[2 * i + j].ToString("F6")+"  J \t"+ y[2 * i + j].ToString("f6")+"     \t");
                    rbTransformData.AppendText("\n");
            }
            for (i = 0; i < n; i++)
            {
                this.chart2.Series[0].Points.AddXY(x[i], y[i]);
            }
            dft(a, b, x, y, n, -1);
            rbTransformData.AppendText("\n Inverse Discrete Fourier Transform \n");
            for (i = 0; i < n / 2; i++)
            {
                for (j = 0; j < 2; j++)
                    rbTransformData.AppendText(x[2 * i + j].ToString("f6")+"  J \t"+ y[2 * i + j].ToString("f6")+"\t");
                    rbTransformData.AppendText("\n");
            }
            for (i = 0; i < n; i++)
            {
                this.chart2.Series[1].Points.AddXY(x[i], y[i]);
            }
        }
    }
}

离散傅里叶变换DiscreteFouriertransform资源-CSDN文库 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值