C++学习| VS配置FFTW3以及一维傅里叶变换的使用

news2024/11/16 6:20:52

前言:最近要用C++对信号进行一维傅里叶变换,但是对傅里叶变换的内容有些遗忘了,同时自己对FFTW使用也不太了解,所以写下此篇方便以后回顾。

VS项目配置FFTW3

FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集。

  1. FFTW包下载:FFTW网站下载对应版本的zip文件,并解压。
  2. Window10开始菜单栏中,搜索“X64 Native Tools Commond Prompt for VS xx”,打开运行“lib.exe”命令。
    在这里插入图片描述
  3. 跳转到解压缩后的库文件目录下,依次输入如下命令生成lib库。
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
lib /machine:x64 /def:libfftw3f-3.def
  1. 把fftw3.h文件加入VS项目的include文件夹中;将libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll文件加入VS项目的bin文件夹中;VS项目中配置好相关lib,“项目-属性-连接器-输入”中补上libfftw3-3.dll、libfftw3f-3.dll和ibfftw3l-3.dll,“项目-属性-连接器-常规-附加库目录”中补上三个lib的地址的地址。

一维傅里叶变换的理解

傅里叶变换(Fourier transform):将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。

狄里赫莱条件:进行傅里叶变换的函数要满足狄里赫莱条件,有限个间断点;有限个极值点;绝对可积。

时域和频域:以一维傅里叶变换为例子,时域图像是信号随着时间的变换图,频域图像是傅里叶变换后不同频率的振幅。
在这里插入图片描述

FFTW3使用一维傅里叶变换

实际中,信号都是采样得到的,并不是连续的,而是很多个离散的点组成,假设有N个点。

fftw_complex* DataIn = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
fftw_complex* DataOut = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
fftw_plan plan = fftw_plan_dft_1d(N, DataIn, DataOut, FFTW_FORWARD, FFTW_ESTIMATE);
// 进行傅里叶变换
fftw_execute(plan);
// 输出幅度谱
for (int i = 1; i < len; i++)
{
	float len = sqrt(DataOut[i][0]*DataOut[i][0] + DataOut[i][1]*DataOut[i][1])/(N/2);
	printf("%.2f ", len);
}

代码参数解释:N表示有N个采样点;DataIn是输入数据;DataOut是输出数据;FFTW_FORWARD为正傅里叶变换(时域变到频域),FTW_BACKWARD为逆傅里叶变换(频域变到时域);FFTW_MEASURE表示准确计算,FFTW_ESTIMATE表示快速估计。

一维傅里叶变换后:

  1. N个采样点,经过DFT(离散傅里叶变换)之后,可以得到N个点的DFT结果,这N个点是以复数形式存储的。
  2. 第1个点表示0HZ,0Hz就是没有波动,专业一点叫做直流分量。从第1个点到N个点,这中间被N-1个点平均分成N等份,每个点的频率依次增加,每个点之间的间隔是Fs/N(Fs是采样频率)。
  3. DFT后,只需要前N/2个结果即可。一方面是因为采样频率是数字信号频率的两倍及以上,另一方面是FFT后结果是对称的。
  4. DFT变换后 ,数值不是真实的幅值,需要进行转换。假设说原始信号峰值是A,DFT变化后,除了第1个点直流分量是A的N倍,每个点的模值是A的N/2倍。(通常可以按照需求进行福值转换,有时候幅值很大,会采取log进行减小,以满足需求)

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

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

相关文章

STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED

今日继续学习使用 STM32 F103C8T6开发板 点亮一个LED灯&#xff0c;文章提供源码&#xff0c;测试工程&#xff0c;实验效果图&#xff0c;希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 &#xff1a; 引脚安排整理&#xff1a; 定时器的引脚例举&#xff1a; …

openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句

文章目录 openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句35.1 语法格式35.2 参数说明35.3 示例 openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句 修改表&#xff0c;包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

Vue自定义指令使用

本篇文章讲述使用Vue自定义指令&#xff0c;并在项目中完成相应功能。 在平常Vue脚手架项目中&#xff0c;使用到 自定义指令较少&#xff0c;一般都是使用的自带指令&#xff0c;比如 v-show 、v-if 、 v-for 、 v-bind 之类的。这些已经能够满足大多数项目使用。更多的可能也…

2462. 雇佣 K 位工人的总代价;948. 令牌放置;1262. 可被三整除的最大和

2462. 雇佣 K 位工人的总代价 核心思想&#xff1a;分情况讨论&#xff0c;当2*candidates > n 时&#xff0c;直接取前k个工人即可&#xff1b;当2*candidates< n时&#xff0c;我们可以维护两个最小堆&#xff0c;然后不断比较堆中的值&#xff0c;然后用i,j两个指针表…

Java项目练习--上

任务一&#xff1a;创建一个简单的银行程序包 目的&#xff1a;Java语言中面向对象的封装及构造器的创建与使用 说明&#xff1a;创建Account类&#xff0c;将源文件放入banking程序包中。在创建单个账户的默认程序包中&#xff0c;已经编写了测试程序TestBanking,这个测试程…

list模拟实现【引入反向迭代器】

文章目录 1.适配器1.1传统意义上的适配器1.2语言里的适配器1.3理解 2.list模拟实现【注意看反向迭代器】2.1 list_frame.h2.2riterator.h2.3list.h2.4 vector.h2.5test.cpp 3.反向迭代器的应用1.使用要求2.迭代器的分类 1.适配器 1.1传统意义上的适配器 1.2语言里的适配器 容…

nginx负载均衡(反向代理)

nginx负载均衡 负载均衡&#xff1a;由反向代理来实现。 nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中&#xff0c;而且配置方法名称&#xff1a;upstream模块&#xff0c;不能写在server模块中&#…

人工智能行业岗位一览

人工智能行业的岗位薪资高、待遇好、涨薪快已经是公开的事实&#xff0c;那么在人工智能行业中具体有哪些职业岗位呢&#xff1f;对于普通人来说&#xff0c;想要入行人工智能又有哪些机会呢&#xff1f; 下面是人工智能领域中的一部分职业岗位&#xff0c;随着技术的不断发展&…

【计算机视觉|生成对抗】生成对抗网络(GAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Generative Adversarial Nets 链接&#xff1a;Generative Adversarial Nets (nips.cc) 摘要 我们提出了一个通过**对抗&#xff08;adversarial&#xff09;**过程估计生成模型的新框架…

基于springboot线上礼品商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

详细介绍渗透测试与漏洞扫描

一、概念 渗透测试&#xff1a; 渗透测试并没有一个标准的定义&#xff0c;国外一些安全组织达成共识的通用说法&#xff1b;通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动的主动分析…

STM32基于CubeIDE和HAL库 基础入门学习笔记:功能驱动与应用

文章目录&#xff1a; 一&#xff1a;LED与按键驱动程序 main.c 1.闪灯 led.h led.c 2.按键控制LED亮灭 key.h key.c 二&#xff1a;蜂鸣器与继电器驱动程序 main.c 1.蜂鸣器 buzzer.h buzzer.c delay.h delay.c 2.继电器 relay.h relay.c 三&#xff1…

STM32定时器级联功能

参考&#xff1a;官方文档《stm32f4xx参考手册.pdf》 级联功能&#xff0c;可以把两个定时器的功能关联起来&#xff0c;具体有以下几种&#xff1a; 本文只讲其中一个功能&#xff0c;定时器1给定时器2当分频器。这种功能可以把两个32位定时器&#xff0c;合并为为一个64位定…

运行 Spring Boot 有哪几种方式?

目录 一、打包用命令或者放到容器中运行 二、用 Maven 插件运行 三、用 Gradle 插件运行 四、直接执行 main 方法运行 一、打包用命令或者放到容器中运行 通过打包和放到容器中运行SpringBoot项目有以下几种方式&#xff1a; 打包为Jar文件&#xff1a; 使用Maven或Gradl…

安装CUDA与CUDNN与Pytorch(最新超级详细图文版本2023年8月最新)

一、安装CUDA 1.1、下载安装包 cuda可以认为就是Nvidia为了显卡炼丹搞的一个软件&#xff0c;其下载地址为&#xff1a;CUDA Toolkit 12.2 Update 1 Downloads | NVIDIA Developer 当你点进这个链接的时候&#xff0c;你需要依次选择 1是选择系统&#xff0c;这里选windows…

【学习日记】【FreeRTOS】任务句柄、任务控制块TCB、任务栈、任务、就绪表详解

写在前面 本文是对FreeRTOS中任务句柄、任务控制块TCB、任务栈、任务、就绪表详解。 一、裸机和RTOS中函数存储位置详解 左图为裸机开发时 RAM 的使用情况&#xff0c;右图是使用了 FreeRTOS 后 RAM 的使用情况&#xff08;图片来自野火&#xff09;。 无论是裸机开发还是Fr…

每天一道leetcode:剑指 Offer 26. 树的子结构(中等递归BFS广度优先遍历树)

今日份题目&#xff1a; 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3 ​/ \ ​4 5 ​/ \ ​1 2 给定的树 B&#xff1a; 4 ​/ ​1 返…

[Axios]在Axios中,怎么实现监听上传数据进度、监听接口返回数据进、如何终止网络请求。实现上传文件实时进度条以及下载文件实时进度条。

1. Axios的本质 Axios的本质是XHR的promise封装&#xff0c;所以XHR的一些函数对它也同样适用。2. 如何监听上传数据的实时进度 // 涉及函数onUploadProgress // 形参: event // 函数作用&#xff1a;请求接口上传的过程中会不停的调用onUploadProgress函数 axiox({url: api/…

自然语言处理: 第七章GPT的搭建

理论基础 在以transformer架构为框架的大模型遍地开花后&#xff0c;大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构&#xff0c;其中以BERT系列为代表encoder-decoder架构&#xff0c;标准的transformer架构以BART和T5为代表 大…