MATLAB图解傅里叶变换(初学者也可以理解)

news2024/9/20 8:01:23

1、概述

相信很多人对于傅里叶变换可能觉得比较复杂和有点难懂,其实不难,它只是一种积分变换
傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。也就是说"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式。而正弦函数在物理上是被充分研究而相对简单的函数类。因为特别好使,所以傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。
为什么使用正弦曲线来分解原函数呢?
因为正弦曲线的保真度。一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的。且只有正弦曲线才拥有这样的性质,所以我们会将原函数分解成正弦函数来处理。

2、连续傅里叶变换Continuous Fourier Transform,CFT

平时看到的傅里叶变换如果没有前缀,通常指的就是连续傅里叶变换。我们先来看一张图片:

从图片中我们可以了解到傅里叶的变换是时间域和频率域的互相转换,由于是连续的,所以使用的是积分。
平时我们所听到的音乐,就是随着时间的变化,听到不同的声音,乐器声和人声的各种混合,如果我想单独将人声给提取出来,这个时候我们可以使用傅里叶变换来处理,将这些不同的声音分解成各自的频率所表示的形式。这样我们就将本来很难处理的时域信号转换成了容易处理的频域信号了(信号的频谱),再利用一些工具对这些频域信号进行处理、加工即可。最后还可以利用傅里叶反变换将这些频域信号转换成时域信号。

3、离散傅里叶变换Discrete Fourier Transform,DFT

实际上我们的计算机是只能处理离散的数值信号,跟数学上的计算是有区别的,这些听到的连续的声音就需要做离散处理,因为计算机本质上只能处理0和1,所以这里不能使用积分,我们知道积分其实是极限的连续求和对吧,那我们这里就只能是离散求和了,而且不能处理无穷,计算机只能处理有限性,这个是前提条件。我们来看一张图片:


可以看到我们的离散傅里叶使用的是求和符号而不是上面的积分符号,在计算机里面我们就是使用这个DFT来处理信号。
直接使用DFT的定义计算的计算复杂度为 O(N²),而快速傅里叶变换(Fast Fourier Transform, FFT)可以将复杂度改进为 O(nlogn)。计算复杂度的降低以及数字电路计算能力的发展,使得DFT成为在信号处理领域十分实用且重要的方法。

从上面的分析来看,我们知道时域分析与频域分析是对信号的两个观察面。时域分析是以时间轴为坐标表示动态信号的关系;频域分析是把信号变为以频率轴为坐标表示出来。
一般来说,时域的表示较为形象与直观,频域分析则更为简练,剖析问题更为深刻和方便。信号分析的趋势是从时域向频域发展。然而,它们是互相联系,缺一不可,相辅相成的,它们的转换就是我们讲的傅里叶变换。

4、MATLAB应用

我们来看下具体的应用,在MATLAB中使用快速傅里叶变换FFT,将会是怎么样的。

先来看下fft函数的定义:

Y = fft(X) 用快速傅里叶变换 (fft) 算法计算 X 的离散傅里叶变换 (DFT)。 
如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。
如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。 
如果 X 是一个多维数组,则 fft(X) 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。

Y = fft(X,n) 返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。
如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。
如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。
如果 X 是矩阵,则每列的处理与在向量情况下相同。
如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同

Y = fft(X,n,dim) 返回沿维度 dim 的傅里叶变换。X 是矩阵,比如:
fft(X,n,1) 沿 X 的各列进行运算,返回每列的傅里叶变换;
fft(X,n,2) 沿 X 的各行进行运算,返回每行的傅里叶变换。

4.1、噪声信号Noise signal

我们来看具体的示例,使用傅里叶变换求噪声中隐藏的信号的频率分量(频谱分析)。

Fs = 1000; %采样频率
T = 1/Fs; %采样周期
L = 1500; %信号长度(1.5秒)
t = (0:L-1)*T; %时间

%创建一个信号,其中包含幅值为0.7,频率为50Hz和幅值为1,频率为120Hz的正弦波
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
%添加一个标准差为2的噪声
X = S + 2*randn(size(t));
%绘制噪声时域信号。
plot(1000*t(1:50),X(1:50))
title('加了噪声的信号')
xlabel('t (毫秒)')
ylabel('X(t)')

通过查看这个时域信号X(t),我们很难确定频率分量,所以我们通过计算傅里叶变换来看频谱分析,这里使用的是快速傅里叶变换: Y = fft(X);

%计算双侧频谱P2,然后基于P2和偶数信号长度L计算单侧频谱P1,单侧频谱表示信号频率的幅度分布只从0到正频率一侧,正负频率是对称的
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

其中这里的abs是返回绝对值,但是这里是复数的形式,所以返回的是它们的模长(幅值),表示的是复数的大小,对于复数还有一个属性比较重要就是相位,表示的是复数的方向。
我们画图看下频谱对应的幅值:

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title('单侧幅值频谱')
xlabel('f (Hz)')
ylabel('|P1(f)|')

可以看到在50Hz120Hz的地方,幅值基本上还是接近0.7和1的,因为加了噪声的缘故,如果没有噪声那肯定是对应着0.7和1,这个大家可以试下。这里我们就可以看出,在时域坐标中,查看信号的频率分量比较困难,当我们使用傅里叶变换之后,在频域中查看信号就变得简单了。

4.2、高斯脉冲Gaussian Pulses

所谓的脉冲就是发送信号,接通一下,断开一下,这个就是一个脉冲,现在的步进电机和伺服电机的驱动都是通过脉冲来驱动。
高斯脉冲是具有高斯形状的时间强度曲线的脉冲,其中高斯函数如下:

f(x) = a*e^{\frac{-(x - b)^2}{2c^2}}

其中a、b、c是常数,a决定了曲线的高度(峰值),b决定了曲线的中心位置(横坐标),c决定了曲线的宽度(标准差)。
因为高斯脉冲的时间强度曲线呈现出高斯分布的特点,所以它在时间和频率上都能达到较好的性能,从而在许多领域得到广泛的应用。
一起来看下高斯脉冲在时域转到频域的情况: 

Fs = 100; %采样频率
t = -0.5:1/Fs:0.5; %时间
L = length(t); %信号长度
%高斯脉冲对应上面公式中的a、b、c了解
X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));

%画图
plot(t,X)
title('时域中的高斯脉冲')
xlabel('Time (t)')
ylabel('X(t)')

从图形中,我们可以看到是一个高斯分布,其中心点是0,峰值约为0.9974,另外公式看出宽度是0.1,这个函数在傅里叶变换中属于典型的特征函数。
在转换频域之前,首先从原始信号长度确定是下一个2次幂的新输入长度。当信号长度不等于2的幂时,使用 nextpow2 函数可提升 fft 的性能,使用的是尾随零填充信号。 

n = 2^nextpow2(L);
%将高斯脉冲转换为频域。
Y = fft(X,n);%length(X):101,n:128,所以length(Y)是128
%画图
f = Fs*(0:(n/2))/n;
P = abs(Y/n);

plot(f,P(1:n/2+1)) 
title('频域中的高斯脉冲')
xlabel('Frequency (f)')
ylabel('|P(f)|')

代码中的nextpow2函数,返回的是下一个2次幂大于等于这些值(绝对值)的指数,比如:

a = [1 -2 3 -4 5 9 519];
p = nextpow2(a)
p =
     0     1     2     2     3     4    10

2.^p 或者 pow2(p)
ans =
     1      2      4      4      8     16    1024


4.3、余弦波

我们来看下最常见的一个波形,比较它们不同频率的情况:

Fs = 1000; %采样频率
T = 1/Fs; %采样周期
L = 1000; % 信号长度
t = (0:L-1)*T; % 时间

%三个余弦波,区别就是频率不一样
x1 = cos(2*pi*50*t); %50Hz
x2 = cos(2*pi*150*t); %150Hz
x3 = cos(2*pi*300*t); %300Hz
% 组合成一个矩阵
X = [x1; x2; x3];

%画出每个余弦波前100个条目
for i = 1:3
    subplot(3,1,i)
    plot(t(1:100),X(i,1:100))
    title(['余弦波 ',num2str(i),' 的时域图形'])
end

这里我们发现三个余弦波,只能说往下的余弦波的频率比上面的要大,还是不能很清晰的表现出其本质,我们将其转换到频域空间看下是什么效果:

%同样的性能考虑,使用nextpow2函数定义新长度
n = 2^nextpow2(L);
%接下来就计算傅里叶变换
dim = 2;
Y = fft(X,n,dim);

%计算每个信号的双侧频谱和单侧频谱
P2 = abs(Y/L);
P1 = P2(:,1:n/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);

%在频域图形里面,画出每一个余弦波的单侧幅值频谱
for i=1:3
    subplot(3,1,i)
    plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))
    title(['余弦波 ',num2str(i),'在频域中的图形'])
end

我们可以看到,时域转换到频域之后,问题就变得简单清晰了,当然最后的三个余弦波我们可以使用第一种噪声的方法,三者相加,然后时域转频域,对比发现在时域中信号比较难处理,变换到频域中就变得简单了。 

傅里叶变换的余弦波

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

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

相关文章

gRPC框架

1、gRPC 与 Protobuf 介绍 微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间 的通信就是个大问题gRPC 可以实现微服务, 将大的项目拆分为多个小且独立的业务模块, 也就是服务, 各服…

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行 实现目的:代码在RAM中调试完成后,就需要将其固化下载到FLASH中,但是FLASH中运行所有程序的话会存在计算或程序运行时间过长的问题,故还需要将部分代…

【C语言初阶】什么操作符你还没搞懂?试试这篇文章让你彻底理解各种操作符!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、 算术操作符:1.1 加减乘除 二、 移位操作符:2.1 计算机中整数的存储2.2 >> 右…

arp欺骗原理以及实现方式

我们知道了arp的作用,那么此时我们怎么可以用他来进行攻击呢?在一个局域网中,我们怎么实现呢? 原理: 这样B就可以做到中间人了,可以接受到两个主机的数据了。换句话来说,在同一个局域网内&…

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)1、概念:什么是 JVM ?JVM 的作用? 2、JVM 的主要组成部分?类加载器(Class Loader):简单…

坚鹏:美国智库认为中国在70%战略产业里领先,美国正迅速衰落

【重榜】2023年12月13日,美国智库信息技术与创新基金会(ITIF)发布重榜报告,认为中国在70%战略产业里领先,美国正迅速衰落。美国智库ITIF认为在计算机和电子产品、化工品、机器设备、机动车、基本金属、金属制品、电气设…

linux 网络子系统 摘要

当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的M…

精细化工ERP系统是什么?精细化工ERP软件包含哪些模块

化工是比较特殊的行业,日常的生产经营活动比较繁杂,传统的手工管理模式逐渐不能满足现代化工管理需求。进入信息化时代,如何顺应现代化工市场发展,是摆在很多化工企业面前的难题。 随着行业竞争愈加激烈,各种成本的上…

Word写大论文常见问题(持续更新)

脚注横线未定格 解决方案:“视图”-“草图”,“引用”-“显示备注”-选择“脚注分隔符”,把横线前的空格删掉。

基于Java SSM框架实现抗疫医疗用品销售系统项目【项目源码+论文说明】

基于java的SSM框架实现抗疫医疗用品销售系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,抗疫医疗用品销售平台当然也不能排除在外。抗疫医疗用品销售平台是以实…

亿欧网首届“元创·灵镜”科技艺术节精彩纷呈,实在智能AI Agent智能体展现硬核科技图景

12月4日-10日,持续一周的首届“元创灵镜”科技艺术节在海南陵水香水湾拉开帷幕,虚实交互创造出的“海岛之镜”开幕式呈现出既真实又虚幻的未来感,融入前沿科技元素的艺术装置作品在“虚实之镜&自然生长”科技艺术展诠释着浪漫想象&#x…

爬虫chrome浏览器抓包说明

chrome浏览器抓包说明 目标:掌握chrome在爬虫中的使用 1. 新建隐身窗口(无痕窗口) 作用:在打开无痕窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,这样就能够尽可…

jpa 修改信息拦截

实现目标springbootJPA 哪个人,修改了哪个表的哪个字段,从什么值修改成什么值 Component // 必须加 Slf4j Configurable(autowire Autowire.BY_TYPE) public class AuditingEntityListener {// 线程变量,保存修改前的 objectprivate Thre…

PyVMomi 克隆虚拟机时将磁盘改为Thin模式

需求介绍: 之前已经使用pyvmomi库实现了虚拟机的自动备份,不过由于备份的虚拟机都是较为重要的系统,磁盘都是厚置备模式,终于有一天,备份目标的空间不够了,导致几个虚拟机无法备份。在不想增加磁盘的情况下…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 (lftp)匿名用户的一些操作(lftp {ip})ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…

Leetcode—380.O(1) 时间插入、删除和获取随机元素【中等】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—380.O(1) 时间插入、删除和获取随机元素 算法思想 实现代码 class RandomizedSet { public:vector<int> nums;unordered_map<int, int> dict;RandomizedSet() {srand((unsigned)time(NULL));}bool insert(…

如何为您的项目选择最优化的 RTLS系统方案

到 2030 年&#xff0c;实时定位市场预计将是当今市场规模的 10 倍&#xff1b;各种全球宏观经济趋势加剧了 RTLS 的指数增长&#xff0c;其中包括&#xff1a; 企业投资回报率的压力增加&#xff0c;从而扩大了对数字化、简化数据和分析的需求&#xff0c;尤其是在 COVID-19 之…

PS扣印章

1 印章区域图片 2 3 吸取印章上的颜色&#xff0c;调节容差&#xff0c;尽量小一点&#xff0c;过大会将背景也进来 4 CtrlJ 把选区复制出来&#xff0c;这个印章图层比较淡&#xff0c;可以通过多复制几个叠加或通过叠加模式来调节。 5 对几个图层选中后CtrlE合并图层 6 选…

Linux查询指定时间点段日志Linux查询指定文件

Linux服务器高效查询日志查询文件 Ⅰ、常用几种日志查询语法Ⅱ、常用几种查询语法 Ⅰ、常用几种日志查询语法 #查询某日志前xx行日志 head -n 行数 日志文件名 #查询某日志后xx行日志 tail -n 行数 日志文件名 #查询固定时间点日志&#xff08;前提是这个时间点确实有日志输出…