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;
}
}
}
}
实序例快速傅里叶变换 Real Sequence Fast Fourier Transform
于 2023-08-22 09:19:14 首次发布