C#实现快速傅里叶变换(FFT)

1、FFT类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;namespace DFT_FFTApp.Utils
{public class FFT{/// <summary>/// FFT/// </summary>/// <param name="xL"></param>/// <returns></returns>public static double[] ButterflyFFT(List<double> xL){int len = xL.Count;if (len == 0){return null;}double[] data_r = new double[len];double[] data_i = new double[len];for (int i = 0; i < len; i++){data_r[i] = xL[i];}double[] fft_r = new double[data_r.Length];double[] fft_i = new double[data_r.Length];double[] result = new double[data_r.Length];BF_FFT(ref data_r, ref data_i, ref fft_r, ref fft_i);GetMod(ref fft_r, ref fft_i, ref result);return result;}/// <summary>/// FFT算法/// </summary>/// <param name="data_r"></param>/// <param name="data_i"></param>/// <param name="result_r"></param>/// <param name="result_i"></param>public static void BF_FFT(ref double[] data_r, ref double[] data_i, ref double[] result_r, ref double[] result_i){if (data_r.Length == 0 || data_i.Length == 0 || data_r.Length != data_i.Length)return;int len = data_r.Length;double[] X_r = new double[len];double[] X_i = new double[len];for (int i = 0; i < len; i++)//将源数据复制副本,避免影响源数据的安全性{X_r[i] = data_r[i];X_i[i] = data_i[i];}DataSort(ref X_r, ref X_i);//位置重排double WN_r, WN_i;//旋转因子int M = (int)(Math.Log(len) / Math.Log(2));//蝶形图级数for (int l = 0; l < M; l++){int space = (int)Math.Pow(2, l);int num = space;//旋转因子个数double temp1_r, temp1_i, temp2_r, temp2_i;for (int i = 0; i < num; i++){int p = (int)Math.Pow(2, M - 1 - l);//同一旋转因子有p个蝶WN_r = Math.Cos(2 * Math.PI / len * p * i);WN_i = -Math.Sin(2 * Math.PI / len * p * i);for (int j = 0, n = i; j < p; j++, n += (int)Math.Pow(2, l + 1)){temp1_r = X_r[n];temp1_i = X_i[n];temp2_r = X_r[n + space];temp2_i = X_i[n + space];//为蝶形的两个输入数据作副本,对副本进行计算,避免数据被修改后参加下一次计算X_r[n] = temp1_r + temp2_r * WN_r - temp2_i * WN_i;X_i[n] = temp1_i + temp2_i * WN_r + temp2_r * WN_i;X_r[n + space] = temp1_r - temp2_r * WN_r + temp2_i * WN_i;X_i[n + space] = temp1_i - temp2_i * WN_r - temp2_r * WN_i;}}}result_r = X_r;result_i = X_i;}/// <summary>/// 对原数据组进行重排/// </summary>/// <param name="data_r"></param>/// <param name="data_i"></param>public static void DataSort(ref double[] data_r, ref double[] data_i){if (data_r.Length == 0 || data_i.Length == 0 || data_r.Length != data_i.Length)return;int len = data_r.Length;int[] count = new int[len];int M = (int)(Math.Log(len) / Math.Log(2));double[] temp_r = new double[len];double[] temp_i = new double[len];for (int i = 0; i < len; i++){temp_r[i] = data_r[i];temp_i[i] = data_i[i];}for (int l = 0; l < M; l++){int space = (int)Math.Pow(2, l);int add = (int)Math.Pow(2, M - l - 1);for (int i = 0; i < len; i++){if ((i / space) % 2 != 0)count[i] += add;}}for (int i = 0; i < len; i++){data_r[i] = temp_r[count[i]];data_i[i] = temp_i[count[i]];}}/// <summary>/// 求模/// </summary>/// <param name="complex_r"></param>/// <param name="complex_i"></param>/// <param name="mod"></param>public static void GetMod(ref double[] complex_r, ref double[] complex_i, ref double[] mod){if (complex_r.Length == 0 || complex_i.Length == 0 || complex_r.Length != complex_i.Length)return;for (int i = 0; i < complex_r.Length; i++)mod[i] = Math.Sqrt(complex_r[i] * complex_r[i] + complex_i[i] * complex_i[i]);}}
}

2、应用

private void DFTInitialize(){List<double> list = GetCaseData(128);double[] res = FFT.ButterflyFFT(list);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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java12 Excel和Json文件解析

Excel文件解析&#xff1a; Excel文件解析(EasyExcel框架解析) Excel文件解析(Apache POl框架解析) &#xff08;1&#xff09;Excel文件对象创建&#xff1a;POI 《1》创建工作簿对象: XSSFWorkbook workbooknew XSSFWorkbook&#xff08;&#xff09;&#xff1b; 《2》创…

SQL语句复习

一、CTE和WITH CTE是一种命名的临时结果集,CTE是通过WITH子句来定义的. WITH cte_name (column1, column2, ...) AS (-- CTE查询定义SELECT ... ) -- 主查询 SELECT ... FROM cte_name WHERE ... column1, column2, ... 是可选的列名列表&#xff0c;通常用于给CTE的列命名。…

c++11新特性-lambda表达式

1. 概念 lambda表达式实际上是一个匿名类的成员函数&#xff0c;该类由编译器为lambda创建&#xff0c;该函数被隐式地定义为内联。因此&#xff0c;调用lambda表达式相当于直接调用它的operator()函数&#xff0c;这个函数可以被编译器内联优化&#xff08;建议&#xff09;。…

Ubuntu服务器时间和本地时间不一致怎么解决——Linux的Local Time和RTC time

最近一直在搞大模型的相关工作&#xff0c;所以一直在用Linux服务器&#xff0c;前面的文章里也提到了&#xff0c;我用的是一台Dell PowerEdge R730xd。 但在使用中发现&#xff0c;IDRAC中的日志时间和本地时间存在时差&#xff0c;大概相关8小时。 对于技术人员&#xff0c…

数据结构:树形结构(树、堆)详解

数据结构&#xff1a;树形结构&#xff08;树、堆&#xff09;详解 一、树&#xff08;一&#xff09;树的性质&#xff08;二&#xff09;树的种类二叉树多叉树满N叉树完全N叉树 &#xff08;三&#xff09;二叉树的实现1、二叉树结构定义2、二叉树功能实现&#xff08;1&…

windows安全中心永久卸载工具分享

使用方法 博客&#xff1a;h0ck1r丶羽~从零到一 卸载工具下载链接&#xff1a; 夸克网盘分享 一路回车&#xff0c;选项Y即可 耐心等待几秒种&#xff0c;自动重启 此时打开windows安全中心&#xff0c;已经完全不能使用了&#xff0c;响应的杀毒功能也关了 往期推荐 【渗透测…

机器人末端阻抗控制Simulink仿真

机器人末端阻抗控制是一种重要的机器人控制策略&#xff0c;它主要用于调节机器人末端执行器与环境之间的动态关系&#xff0c;以保证机器人在适当的柔顺性下进行轨迹跟踪或与环境交互。在使用Simulink进行机器人末端阻抗控制仿真时&#xff0c;主要步骤可以归纳如下&#xff1…

QT做一个USB HID设备识别软件

1.下载 HidApi库&#xff1a;GitHub - yigityuce/HidApi: Human Interface Device Api (HidApi) with C 2.pro文件添加 DEFINES - UNICODE LIBS -lsetupapi 3.建立三个对象 HidApi hidApi;HidDevice hidDev;//HID设备HidDeviceList devList;//HID设备列表 4.对 HID 设备进…

JavaWeb - Spring Boot

Spring 官网​​​​​Spring | Home Spring Boot Spring Boot是一个由Pivotal团队提供的开源框架&#xff0c;旨在简化Spring应用的初始搭建以及开发过程。在Spring Boot项目中&#xff0c;通常会有Controller、Service、Mapper和Entity等层次结构。下面将详细介绍这些层次的…

用 Higress AI 网关降低 AI 调用成本 - 阿里云天池云原生编程挑战赛参赛攻略

作者介绍&#xff1a;杨贝宁&#xff0c;爱丁堡大学博士在读&#xff0c;研究方向为向量数据库 《Higress AI 网关挑战赛》正在火热进行中&#xff0c;Higress 社区邀请了目前位于排行榜 top5 的选手杨贝宁同学分享他的心得。下面是他整理的参赛攻略&#xff1a; 背景 我们…

Serilog文档翻译系列(三) - 基础配置

Serilog 使用简单的 C# API 来配置日志记录。当需要外部配置时&#xff0c;可以&#xff08;慎用&#xff09;通过使用 Serilog.Settings.AppSettings 包或 Serilog.Settings.Configuration 包进行混合配置。 创建日志记录器 日志记录器是通过 LoggerConfiguration 对象创建的…

基于springboot的汽车租赁管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的汽车租赁管理系统,java…

【RabbitMQ】快速上手

目 录 一. RabbitMQ 安装二. RabbitMQ 核心概念2.1 Producer 和 Consumer2.2 Connection 和 Channel2.3 Virtual host2.4 Queue2.5 Exchange2.6 RabbitMQ 工作流程 三. AMQP四. web界面操作4.1 用户相关操作4.2 虚拟主机相关操作 五. RabbitMQ 快速入门5.1 引入依赖5.2 编写生产…

stm32 8080时序驱动lcd屏幕

PSAM使用的硬件接口 PSAM读时序 PSAM写时序 相关时序 PSAM_RCRx NOR 和PSRAM控制寄存器

28. 双耳配对 - 配置

1. 概述 通过MAC地址的最后一位的奇偶来判断左右耳 2. 验证 右耳:奇数(主耳)-》BT ADDR: 12:42:22:34:34:6d 左耳:偶数(从耳)-》BT ADDR: 12:42:22:34:34:6c

TPH-YOLOv5:基于Transformer预测头的改进YOLOv5,用于无人机捕获场景的目标检测

摘要 提出了TPH-YOLOv5。在YOLOv5的基础上&#xff0c;增加了一个预测头来检测不同尺度的目标。然后用Transformer Prediction Heads&#xff08;TPH&#xff09;代替原有的预测头&#xff0c;探索自注意机制的预测潜力。还集成了卷积块注意力模型&#xff08;CBAM&#xff09;…

前端学习Day36

Day36:P177-P181 学习笔记: 1.面向过程&#xff1a; 就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了。 2.面向对象&#xff1a; 是把事务分解成为一个个对象&#xff0c;然后由对象之间…

Gland安装与Debug

下载地址&#xff1a;https://www.jetbrains.com.cn/go/download/#sectionwindows debug官方文档: https://www.jetbrains.com/help/go/debugging-code.html 创建项目 选择新建项目 填写项目本地路径&#xff0c;以及选择go SDK 项目创建后检查项目设置 添加main包以及…

安装MySQL,navicat以及Django配置遇到的一些问题

MySQL安装问题 安装MySQL按照了此文章&#xff1a; MySQL数据库下载及安装教程&#xff08;最最新版&#xff09;_mysql下载安装-CSDN博客https://blog.csdn.net/weixin_39289696/article/details/128850498首先是遇到了starting the server红色叉号显示 按照上面文章的介绍…

Linux--IO多路复用(select,poll,epoll)

IO多路复用——select&#xff0c;poll&#xff0c;epoll IO多路复用是一种操作系统技术&#xff0c;旨在提高系统处理多个输入输出操作的性能和资源利用率。与传统的多线程或多进程模型相比&#xff0c;IO多路复用避免了因阻塞IO而导致的资源浪费和低效率问题。它通过将多个IO…