结果展示:
代码部分:
using MathNet.Numerics;
using MathNet.Numerics.IntegralTransforms;
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;
using System.Windows.Forms.DataVisualization.Charting;
namespace 快速傅里叶变换
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int numPoint = 200;
double[] t = new double[numPoint];
double[] signal = new double[numPoint];
for (int i = 0; i < numPoint; i++)
{
t[i] = i * 0.005;
signal[i] = Math.Sin(2 * Math.PI * 5 * t[i]) +Math.Sin(2 * Math.PI * 10 * t[i]) + 0.2 * MathNet.Numerics.Distributions.Normal.Sample(0,1);
}
Complex32[] complexData = new Complex32[signal.Length];
注意:"虚数单位不可以等于零。
在复数a+bi中,a称为复数的实部,b称为复数的虚部,i称为虚数单位。当虚部等于零时,这个复数就是实数;当虚部不等于零时,这个复数称为虚数,虚数的实部如果等于零,则称为纯虚数。由上可知,复数集包含了实数集,因而是实数集的扩张。
在计算中规定i的平方=-1,并且i可以与实数在一起按照同样的运算律进行四则运算,i叫做虚数单位。
所以,虚数单位不等于零。"
for (int i = 0; i < signal.Length; i++)
{
complexData[i] = new Complex32((float)signal[i], 0.0f);//当虚部等于零时,这个复数就是实数
}
Fourier.Forward(complexData, FourierOptions.Default);
double samplingRate = 1.0 / 0.05;//1s采集多少个数据
double[] frequencies = Fourier.FrequencyScale(numPoint, samplingRate);
//原始信号
chart1.Series.Clear();
System.Windows.Forms.DataVisualization.Charting.Series originalSignalSeries = new System.Windows.Forms.DataVisualization.Charting.Series("原始信号");
originalSignalSeries.ChartType = SeriesChartType.Line;
for (int i = 0; i < numPoint; i++)
{
originalSignalSeries.Points.AddXY(t[i],signal[i]);
}
chart1.Series.Add(originalSignalSeries);
//幅度谱
chart2.Series.Clear();
System.Windows.Forms.DataVisualization.Charting.Series amplitudeSpectrumSeries = new System.Windows.Forms.DataVisualization.Charting.Series("幅度谱");
amplitudeSpectrumSeries.ChartType = SeriesChartType.Line;
for (int i = 0; i < numPoint / 2; i++)
{
amplitudeSpectrumSeries.Points.AddXY(frequencies[i], complexData[i].Magnitude);
}
chart2.Series.Add(amplitudeSpectrumSeries);
//相位谱
chart3.Series.Clear();
System.Windows.Forms.DataVisualization.Charting.Series phaseSpectrumSeries = new System.Windows.Forms.DataVisualization.Charting.Series("幅度谱");
phaseSpectrumSeries.ChartType = SeriesChartType.Line;
for (int i = 0; i < numPoint / 2; i++)
{
phaseSpectrumSeries.Points.AddXY(frequencies[i], complexData[i].Phase);
}
chart3.Series.Add(phaseSpectrumSeries);
}
}
}