using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
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_B
{
public partial class Real_Sequence_FFT_B_Form : Form
{
static double[] result = new double[64];
public Real_Sequence_FFT_B_Form()
{
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, j, n = 64;
rbPointData.Clear();
rbTransformData.Clear();
for (int r = 0; r < n; r++)//clear residual data
{
img[r] = 0.0;
real[r] = 0.0;
}
foreach (var series in chart1.Series)
{
series.Points.Clear();
}
foreach (var series in chart2.Series)
{
series.Points.Clear();
}
//double[] x = new double[64];
for (i = 0; i < 10; i++) //real sequence's front 10 data -> 0.0
{
real[i] = 0.0;
img[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;
}
for (i = 0; i < n; i++)
{
chart1.Series[0].Points.AddXY(real[i], img[i]);
}
r1fft(real, n);//generate conjugate sequence real[0].....real[n/2] || img[n/2+1].....img[n]
//real[n/2+i] = real[n/2-i] i=1.....n/2-1
//img[i] = img[n-i], img[n/2+i] = -img[n/2+i],
//real[0]....................real[n/2]real[n/2+1]..................real[n]
//real[0]....................real[n/2] back equal
//real[n-1].......... real[n/2+1] |
// | img[1]......................img[n/2]
// equal -img[n/2+1]................-img[n-1]
rbPointData.AppendText("\n DISCRETE FOURIER TRANSFORM\n");
rbPointData.AppendText("\t" + real[0].ToString("f6") + "\t" + "\t");
chart1.Series[1].Points.AddXY(real[0], 0.0);
rbPointData.AppendText("\t" + real[1].ToString("f6") + "\t J " + real[n - 1].ToString("f6"));
chart1.Series[1].Points.AddXY(real[1], real[n - 1]);
for (i = 2; i < n / 2; i += 2)
{
rbPointData.AppendText("\t" + real[i].ToString("f6") + "\t J " + real[n - i].ToString("f6"));
rbPointData.AppendText("\t" + real[i + 1].ToString("f6") + "\t J " + real[n - i - 1].ToString("f6"));
chart1.Series[1].Points.AddXY(real[i], real[n - i]);
chart1.Series[1].Points.AddXY(real[i + 1], real[n - i - 1]);
rbPointData.AppendText("\n");
}
rbPointData.AppendText("\t" + real[n / 2].ToString("f6") + "\t" + "\t");
rbPointData.AppendText("\t" + real[n / 2 - 1].ToString("f6") + "\t J " + (-real[n / 2 + 1]).ToString("f6"));
chart1.Series[1].Points.AddXY(real[n / 2], 0.0);
for (i = 2; i < n / 2; i += 2)
{
rbPointData.AppendText("\t" + real[n / 2 - i].ToString("f6") + "\t J " + (-real[n / 2 + i]).ToString("f6"));
rbPointData.AppendText("\t" + real[n / 2 - i - 1].ToString("f6") + "\t J " + (-real[n / 2 + i + 1]).ToString("f6"));
chart1.Series[1].Points.AddXY(real[n / 2 - i], -real[n / 2 + i]);
chart1.Series[1].Points.AddXY(real[n / 2 - i - 1], -real[n / 2 + i + 1]);
rbPointData.AppendText("\n");
}
// write value to r1fft.dat file
string path = "r1fft.dat";
FileStream FS_BW = new FileStream(path, FileMode.Create);//r1fft.dat => \bin\debug\r1fft.dat
BinaryWriter BW = new BinaryWriter(FS_BW);
for (i = 0; i < n; i++)
{
BW.Write(i + ", " + real[i] + ", \n");
}
BW.Close();
FS_BW.Close();
for (i = 1; i < n / 2; i++)
{
real[i] = Math.Sqrt(real[i] * real[i] + real[n - i] * real[n - i]);
}
real[n / 2] = Math.Abs(real[n / 2]);
rbTransformData.AppendText(" X(k) Spectrum:\n");
for (i = 0; i <= n / 2; i++)
{
chart2.Series[0].Points.AddXY(i, real[i]);
rbTransformData.AppendText("\t" + i.ToString() + "\t " + real[i].ToString("f6"));
}
}
}
}
实序列傅里叶变换_B Real Sequence Fourier Transform
于 2023-08-23 08:41:40 首次发布