MATLAB 快速傅里叶变换(fft)结果为什么是复数?

2023-11-10

文章核心是两部分:
(1)从直观和本质的角度,说明为什么快速傅里叶变换的结果是复数;
(2)详细说明了MATLAB中fft函数的运用方法,并给出了fft幅度谱的求解代码。
但要真正了解快速傅里叶变换,核心是理解“FFT的计算原理”!!!


目录

一、直观解释

二、本质原因之FFT的计算原理 (关键)

三、MATLAB中fft函数说明

函数形式

参数说明

四、 FFT求频率-幅值谱的MATLAB 代码

五、扩展阅读


一、直观解释

第一,从定义式上看,积分号里含有复数,积分结果是复数;

第二,从傅立叶变换的物理意义上看:傅里叶变换是将一个信号分解为多个信号之和的形式,并且是正弦或余弦信号叠加的形式。决定一个正弦波x=Asin(\omega t+\psi ),需要频率、振幅和相位,三者缺一不可,其中频率由x轴给出,而振幅和相位可以由复数准确表达。对于 复数 a+bi,其振幅 和相位 \psi 如下:(注:MATLAB中fft函数的结果即采用这样这种方式表达

A=\sqrt(a^2+b^2)

\psi=\arctan (b/a)

PS 来源:百度知道,但有部分修改!


二、本质原因之FFT的计算原理 (关键)

要从本质上解释为什么快速傅里叶变换的结果是复数,需要理解快速傅里叶变换的计算原理。可参考如下帖子,写的十分优秀且详细!

十分简明易懂的FFT(快速傅里叶变换)

快速傅里叶变换(FFT)详解


三、MATLAB中fft函数说明

以下内容在MATLAB快速傅里叶变换(fft)函数详解的基础上修改!

函数形式

​​(1)  Y = fft(y);

(2) Y = fft(y,N);

式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。

参数说明

1.  函数fft返回值的数据结构具有对称性

根据采样定理,fft能分辨的最高频率为采样频率的一半(即Nyquist频率),函数fft返回值是以Nyqusit频率为轴对称的,Y的前一半与后一半是复数共轭关系(复数共轭是因为快速傅里叶变换计算中单位根之间的复数共轭关系)。

2.  幅值

作FFT分析时,幅值大小与输入点数有关,要得到真实的幅值大小,只要将变换后的结果乘以2除以N即可(此时得到的单边谱),但此时单边谱的“零频分量”的幅值为实际值的2倍。对此的解释是:Y除以N得到双边谱,再乘以2得到单边谱,但零频在双边谱中本没有被一分为二,而转化为单边谱过程中所有幅值均乘以2,所以零频被放大了。在求解过程中,可以通过 P1(2:end-1) = 2*P1(2:end-1) 有效去除零频放大的问题。

3.  基频

​若分析数据时长为T,则分析结果的基频就是f0=1/T,分析结果的频率序列为[0:LF-1]*f0

4.  执行N点FFT

在调用格式2中,函数执行N点FFT。若y为向量且长度小于N,则函数将y补零至长度N,若向量y的长度大于N,则函数截断y使之长度为N。使用N点FFT时,若N大于向量y的长度,将给频谱分析结果带来变化,应该特别注意,具体影响见下图。


四、 FFT求频率-幅值谱的MATLAB 代码

clc;
clear;
close all;
 
% 原信号
t = 0:0.01:2;
fs = 1 /0.01; % 采样频率
x = chirp(t,100,1,200,'quadratic');
LF=length(x);

% 傅里叶变换
xf_o=fft(x); % 傅里叶变换的结果是对称的,原因单位根之间存在复共轭,具体请阅读第二部分“FFT的计算原理”
f_o=(1:LF).*fs/LF; % 频率轴
xf_oc=fftshift(xf_o); % 将零频移动到输出的中心位置
f_oc=(floor(-LF/2):floor(LF/2)-1).*fs/LF;  % 频率轴

figure
subplot(311)
plot(t,x)
title('输入信号');xlabel('Time');ylabel('Amplitude');
subplot(312)
plot(f_o,xf_o) % xf_o是复数,但图形仅画实部,忽略虚部。
title('fft结果');xlabel('Frequency');ylabel('Real part of fft');
subplot(313)
plot(f_oc,xf_oc)
title('零频移动到输出中心的fft结果');xlabel('Frequency');ylabel('Real part of fft');


% 双边谱
xf_da=abs(xf_oc)/LF; % 归一化后的双边谱
f_d=(floor(-LF/2):floor(LF/2)-1).*fs/LF; % 频率轴

% 单边谱
xf_s=abs(xf_o)/LF; % 归一化的谱
xf_sa=xf_s(1:floor(LF/2)+1); 
xf_sa(2:end-1)=2*xf_sa(2:end-1); % 单边谱,且去除零频放大效应!
f_s=fs*(0:floor(LF/2))/LF; % 频率轴,根据采样定理,Nyquist频率是采样频率的一半!单位'Hz'

% 相位谱
xf_dp=angle(xf_o); % 单位是“弧度” ,与[xf_dp=phase(xf_o)]等价!
xf_p=xf_dp(1:floor(LF/2)+1); % 相位谱

figure
subplot(311)
plot(f_d,xf_da)
title('fft 双边频率-幅度谱');xlabel('Frequency');ylabel('Magnitude');
subplot(312)
plot(f_s,xf_sa)
title('fft 单边频率-幅度谱');xlabel('Frequency');ylabel('Magnitude');
subplot(313)
plot(f_s,xf_p)
title('fft 相位谱');xlabel('Frequency');ylabel('Phase (rad)');

结果1:fft的直接计算结果,仅画出实部,忽略虚部。结合第三部分参数说明“1函数fft返回值的数据结构具有对称性”理解。至于为什么对称,需要了解fft的计算原理!

结果2:简单而言,fft单边谱是双边谱的两倍,但需注意“零频”的放大效应!结合第三部分参数说明“2.  幅值”理解


五、扩展阅读

(1)傅里叶变换概念及公式推导

(2)MATLAB中的快速傅里叶变换FFT与IFFT

(3)关于FFT的相位谱

(4)How to interpret FFT results – obtaining magnitude and phase information

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB 快速傅里叶变换(fft)结果为什么是复数? 的相关文章

  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • Matlab - 如果值包含xxx,则删除元胞数组中的行

    在 Matlab 中 如何删除包含变量字符串的元胞数组中的元胞 假设我的元胞数组是 C svnTrunk RadarLib radarlb utilities scatteredInterpolant m C svnTrunk RadarL
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 使用mat2cell将MxN的矩阵划分为1xN大小的M矩阵

    我有一个大小为 MxN 的矩阵 比方说 1867x3 1867 行和 3 列 我想将其分成 1867 个大小为 1x3 的单元格 我使用了mat2cell X 1 1866 这里X是矩阵 1867x3 结果给出了两个单元格 一个单元格的大小
  • Simulink 仿真引擎如何工作?

    我想了解 Simulink 仿真引擎的工作原理 它是否使用离散事件模拟机制 那么如何处理连续时间 它是否依赖于基于静态循环的代码生成 或者 在第一个周期之前 它会计算出块的执行顺序 从不需要任何其他块输入的块开始 每个周期 它都会根据输入和
  • Matlab没有优化以下内容吗?

    我有一个很长的向量 1xrv 和一个很长的向量w1xs 和一个矩阵Arxs 它是稀疏的 但维度非常大 我期望 Matlab 对以下内容进行优化 这样我就不会遇到内存问题 A v w 但看起来 Matlab 实际上是在尝试生成完整的v w矩阵
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • matlab中的排列函数是如何工作的

    这是一个有点愚蠢的问题 但我似乎无法弄清楚排列在 matlab 中是如何工作的 以文档为例 A 1 2 3 4 permute A 2 1 ans 1 3 2 4 到底是怎么回事 这如何告诉 matlab 3 和 2 需要交换 哇 这是我迄
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • MATLAB 中的霍夫变换

    有谁知道如何使用霍夫变换来检测二值图像中最强的线 A zeros 7 7 A 6 10 18 24 36 38 41 1 使用 rho theta 格式 其中 theta 以 45 为步长 从 45 到 90 以及如何在 MATLAB 中显
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • 快速有效地计算已知特征值的特征向量

    我的问题的简短版本 计算矩阵特征向量的最佳方法是什么A 如果我们已经知道属于特征向量的特征值呢 更长的解释 我有一个很大的随机矩阵A由于它是随机的 因此具有非负左特征向量x 这样A Tx x 我正在寻找快速有效的方法来数值计算这个向量 最好
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • 检测分段常数信号中的阶跃

    我有一个分段恒定信号 如下所示 我想检测步骤转换的位置 标记为红色 我目前的做法 使用移动平均滤波器平滑信号 http www mathworks com help signal examples signal smoothing html

随机推荐

  • 学习笔记 JavaScript ES6 深拷贝与浅拷贝

    学习内容 如何把一个对象复制给另一个对象 如何把一个对象复制给另一个对象 浅拷贝的可以理解为对象拷贝成功后 当有一个对象发生变化时 另一个也受到影响 这个主要是与引用地址有关 用Object assign 方法进行拷贝不安全 是潜拷贝 来看
  • Spring源码从入门到精通---@Value赋值(十)

    上篇文章介绍了BeanPostProcessor spring框架生命周期 PostConstruct PreDestroy InitializingBean disposableBean接口 依赖注入 Autowird都离不开这个接口 B
  • Python兼职五天赚3000,方法经验分享,带你实现财富自由!!!

    大学生用Python兼职五天狂赚1200 方法经验分享 让你早日实现财富自由 现在的年轻人虽然表面风光 可是却很难攒下钱 这一类人被定义为 隐形贫困者 原因是什么呢 根据小编的分析 现在人们对生活质量要求普遍提高了 但是工资没有跟得上自己的
  • 正则表达式之-验证邮箱

    一 邮箱正则概述 昨天在开发项目的时候 有一个验证邮箱的需求 本来想着自己写一个正则表达式来验证的 但是写的时候却发现很多关于正则的知识都忘的差不多了 有些东西想记住真的就要重复练习 看明白了没有用 要天天练习才行 于是在参考了众多资料之后
  • 使用servlet处理HTTP响应

    1 解释http协议中包含哪几部份 状态行 放的是协议 版本 状态码描述 响应头 键 值 空行 内容 消息体 2 解释状态行的作用 有哪些常见的状态码 分别代表什么含义 状态行作用在Servlet中设置状态码来实现许多重要功能 状态码 20
  • JPA @Id 和 @GeneratedValue 注解介绍

    转载自一个404页面 Id Id 注解用于声明一个实体类的属性映射为数据库的主键列 该属性通常置于属性声明语句之前 可与声明语句同行 也可写在单独行上 Id标注也可置于属性的getter方法之前 GeneratedValue Generat
  • OPPO/真我手机ColorOS13系统解账户锁-移除手机密码图案锁方法

    在搞机之前 请确定自己的手机不是非法获取 本文只讲叙ColorOS13系统解锁方法 仅为个人测试研究出来的经验 未对官方系统进行任何修改 只推荐专业维修师傅从维修的角度进行解锁 不推荐个人用户对非自己的手机进行非法破解 产生任何违法行为需要
  • 第十四届蓝桥杯三月真题刷题训练——第 27 天

    目录 第 1题 数学考试 前缀和 代码 第 2 题 地标访问 二分 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明 提示 代码 第 1题 数学考试 前缀和 代码 package 第十四届蓝桥杯三月真题刷题训练 day27 imp
  • 常见文件文件头

    各类文件的文件头标志 1 从Ultra edit 32中提取出来的 附件 文件格式分析器 JPEG jpg 文件头 FFD8FF PNG png 文件头 89504E47 GIF gif 文件头 47494638 TIFF tif 文件头
  • NAT介绍

    在传统TCP IP通信过程中 所有的路由器仅仅是充当一个中间人的角色 也就是通常 所说的存储转发 即路由器不会对转发的数据包进行修改 准确地讲 除了将源MAC地址 换成自己的MAC地址以外 路由器不会对转发的数据包做任何修改 而NAT恰恰是
  • J2EE-007 反射+BaseServlet实现

    因为之前都是用的幕布进行文章发布现在移动到这里进行统一管理 文章我就不再编写了 后面会用CSDN进行编写 望审核给与通过谢谢 https share mubu com doc 3hGLbDxQhQV
  • Linux进程间通信——eventfd

    Table of Contents 什么是eventfd 创建eventfd 读eventfd 写eventfd 使用例子 什么是eventfd eventfd是Linux 2 6提供的一种系统调用 它可以用来实现事件通知 eventfd包
  • 《深入理解计算机系统》实验五Cache Lab

    前言 深入理解计算机系统 实验五Cache Lab下载和官方文档机翻请看 https blog csdn net weixin 43362650 article details 121989400 我觉得这个文档对整个实验很有帮助 对于我来
  • CTracker

    https github com pjl1995 CTracker 本机可以跑 jacke121 CTracker master 可视化 demo show py 效果不是特别好 论文地址 https arxiv org pdf 2007
  • Python 生成随机各类字符串

    Python 生成随机各类字符串 Python 生成随机字符串 包括字符和数字组合 大写字符串 小写字符串 参数 字符数量 数字数量 def random stringdigit letter count digit count str1
  • 软件测试之从0到1完成UI自动化测试框架搭建系列(3)

    上节 我们讲了下 如何运用uiautomator2 atx pytest进行自动化的单元测试 这节 我们再思考下 如果我们每条用例 都去一步一步 先元素定位 然后写操作 然后写各种方法 那这个代码量是不是就有点偏多了 另外也不方便维护 比如
  • win10操作系统jdk11不带jre的解决办法、单/多版本jdk环境变量的配置、javac不可用的解决方法

    目录 win10操作系统jdk11不带jre的解决办法 两个java版本的jdk环境变量的配置 只有一个java版本时只需设置以下变量 怎么解决javac不可用的问题 win10操作系统jdk11不带jre的解决办法 在开始菜单中寻找命令提
  • 时钟抖动(Jitter)的基本概念

    随着通信系统中的时钟速率迈入GHz级 抖动这个在模拟设计中十分关键的因素 也开始在数字设计领域中日益得到人们的重视 在高速系统中 时钟或振荡器波形的时序误差会限制一个数字I O接口的最大速率 不仅如此 它还会导致通信链路的误码率增大 甚至限
  • android五大布局之LinearLayout

    初次接触android的同学 最先接触的也就是android的布局了 因为android的代码与界面是分开的 因此想要界面显示什么 布局应该是第一步 就像一个孩子生下来你要给他穿衣服一样 因此 我们现在所写的布局就是你看到项目运行的界面 L
  • MATLAB 快速傅里叶变换(fft)结果为什么是复数?

    文章核心是两部分 1 从直观和本质的角度 说明为什么快速傅里叶变换的结果是复数 2 详细说明了MATLAB中fft函数的运用方法 并给出了fft幅度谱的求解代码 但要真正了解快速傅里叶变换 核心是理解 FFT的计算原理 目录 一 直观解释