C# 实现傅里叶变化(DFT)

1、DFT函数类

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DFT_FFTApp.Utils
{
    public class DFT
    {
        /// <summary>
        /// DFT
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List<List<double>> DFTNative(List<double> data)
        {
            int N = data.Count;
            List<List<double>> xks = new List<List<double>>();
            for (int k = 0; k < N; k++)
            {
                List<double> xk = DFTPoint(k, data);
                xks.Add(xk);
            }
            GC.Collect();
            return xks;
        }
        /// <summary>
        /// 单点DFT
        /// </summary>
        /// <param name="k"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List<double> DFTPoint(int k, List<double> data)
        {
            int N = data.Count;
            double real = 0;
            double image = 0;
            for (int n = 0; n < N; n++)
            {
                real += data[n] * Math.Cos(2 * Math.PI * (k * n) / N);
                image -= data[n] * Math.Sin(2 * Math.PI * (k * n) / N);
            }
            List<double> res = new List<double>() { real, image };
            return res;
        }
        /// <summary>
        /// 频域求模
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List<double> GetMod(List<List<double>> data)
        {
            List<double> res= new List<double>();
            foreach(var  x in data)
            {
                res.Add(Math.Sqrt(x[0] * x[0] + x[1] * x[1]));
            }
            return res;
        }
        /// <summary>
        /// 频域求相位
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List<double> GetPhase(List<List<double>> data)
        {
            List<double> res = new List<double>();
            foreach (var x in data)
            {
                double phase = 0;
                if (x[0] == 0)
                {
                    phase = 90;
                }
                else
                {
                    phase = Math.Atan2(x[1], x[0]);
                }
                res.Add(phase);
            }
            return res;
        }

    }
}

2、应用

csharp 复制代码
private void DFTApp()
        {
            List<double> list = GetCaseData(128);
            List<List<double>> Xk = DFT.DFTNative(list);
            List<double> res = DFT.GetMod(Xk);
            foreach (double item in res)
            {
                Console.WriteLine(item);
            }
            easyChartX1.Plot(res, 0, 1);
        }
/// <summary>
        /// 获取时域数据
        /// </summary>
        /// <param name="points"></param>
        /// <returns></returns>
        private List<double> GetCaseData(int points)
        {
            List<double> data = new List<double>();
            double w = 2*Math.PI / points;
            for(int i = 0; i < points;i++)
            {
                double d=Math.Sin(w * i);
                //Console.WriteLine($"i={i},d={d.ToString("G2")}");
                data.Add(d);
            }
            return data;
        }
相关推荐
csbysj202010 分钟前
如何使用 XML Schema
开发语言
R6bandito_15 分钟前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
earthzhang202122 分钟前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
杨枝甘露小码30 分钟前
Python学习之基础篇
开发语言·python
武文斌771 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
爱吃喵的鲤鱼1 小时前
仿mudou——Connection模块(连接管理)
linux·运维·服务器·开发语言·网络·c++
beyond谚语1 小时前
C#学习小笔记(完整版)—— Patience
c#
爱吃小胖橘1 小时前
Unity网络开发--超文本传输协议Http(1)
开发语言·网络·网络协议·http·c#·游戏引擎
郝学胜-神的一滴2 小时前
使用Linux的read和write系统函数操作文件
linux·服务器·开发语言·数据库·c++·程序人生·软件工程
小火柴1232 小时前
利用R语言绘制直方图
开发语言·r语言