C# 实现快速傅里叶变换代码

结果展示:

代码部分:

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);
 
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值