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]);
}
}
}
}
离散傅里叶变换 Discrete Fourier Transform
最新推荐文章于 2024-06-22 21:53:36 发布