matlab中fft快速傅里叶变换
视频来源:https://www.bilibili.com/video/av51932171?t=628。
博文来源:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle
视频来源很好的解释了:
1 .傅里叶变换过程,经过傅里叶变化得到了,频率w,振幅a0,相位角φ;
2. 傅里叶变换 主要应用领域: 声音, 图像处理;
博文则很好的解释了:
1. 傅里叶变换在matlab软件中怎样应用
2.. 傅里叶变换的作用效果的展示,从时域到频域的变化,时域难以解决的问题到频域中却很清晰。
说明
示例
噪声信号
使用傅里叶变换求噪声中隐藏的信号的频率分量。
指定信号的参数,采样频率为 1 kHz,信号持续时间为 1.5 秒。
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1500; % Length of signal
t = (0:L-1)*T; % Time vector
构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
用均值为零、方差为 4 的白噪声扰乱该信号。
X = S + 2*randn(size(t));
在时域中绘制噪声信号。通过查看信号 X(t)
很难确定频率分量。
plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')
计算信号的傅里叶变换。
Y = fft(X);
计算双侧频谱 P2
。然后基于 P2
和偶数信号长度 L
计算单侧频谱 P1
。
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
定义频域 f
并绘制单侧幅值频谱 P1
。与预期相符,由于增加了噪声,幅值并不精确等于 0.7 和 1。一般情况下,较长的信号会产生更好的频率近似值。
f = Fs*(0:(L/2))/L;
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
现在,采用原始的、未破坏信号的傅里叶变换并检索精确幅值 0.7 和 1.0。
Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1); plot(f,P1)
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
高斯脉冲
将高斯脉冲从时域转换为频域。
定义信号参数和高斯脉冲 X
。
Fs = 100; % Sampling frequency
t = -0.5:1/Fs:0.5; % Time vector
L = length(t); % Signal length X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));
在时域中绘制脉冲。
plot(t,X)
title('Gaussian Pulse in Time Domain')
xlabel('Time (t)')
ylabel('X(t)')
要使用 fft
将信号转换为频域,首先从原始信号长度确定是下一个 2 次幂的新输入长度。这将用尾随零填充信号 X
以改善 fft
的性能。
n = 2^nextpow2(L);
将高斯脉冲转换为频域。
Y = fft(X,n);
定义频域并绘制唯一频率。
f = Fs*(0:(n/2))/n;
P = abs(Y/n); plot(f,P(1:n/2+1))
title('Gaussian Pulse in Frequency Domain')
xlabel('Frequency (f)')
ylabel('|P(f)|')
余弦波
比较时域和频域中的余弦波。
指定信号的参数,采样频率为 1kHz,信号持续时间为 1 秒。
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
创建一个矩阵,其中每一行代表一个频率经过缩放的余弦波。结果 X
为 3×1000 矩阵。第一行的波频为 50,第二行的波频为 150,第三行的波频为 300。
x1 = cos(2*pi*50*t); % First row wave
x2 = cos(2*pi*150*t); % Second row wave
x3 = cos(2*pi*300*t); % Third row wave X = [x1; x2; x3];
在单个图窗中按顺序绘制 X
的每行的前 100 个项,并比较其频率。
for i = 1:3
subplot(3,1,i)
plot(t(1:100),X(i,1:100))
title(['Row ',num2str(i),' in the Time Domain'])
end
出于算法性能的考虑,fft
允许您用尾随零填充输入。在这种情况下,用零填充 X
的每一行,以使每行的长度为比当前长度大的下一个最小的 2 的次幂值。使用 nextpow2
函数定义新长度。
n = 2^nextpow2(L);
指定 dim
参数沿 X
的行(即对每个信号)使用 fft
。
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(['Row ',num2str(i),' in the Frequency Domain'])
end
输入参数
X
- 输入数组 向量 | 矩阵 | 多维数组
输入数组,指定为向量、矩阵或多维数组。
如果 X
为 0×0 空矩阵,则 fft(X)
返回一个 0×0 空矩阵。
数据类型: double
| single
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
复数支持: 是
n
- 变换长度 []
(默认) | 非负整数标量
变换长度,指定为 []
或非负整数标量。为变换长度指定正整数标量可以提高 fft
的性能。通常,长度指定为 2 的幂或可分解为小质数的乘积的值。如果 n
小于信号的长度,则 fft
忽略第 n
个条目之后的剩余信号值,并返回截断的结果。如果 n
为 0
,则 fft
返回空矩阵。
示例: n = 2^nextpow2(size(X,1))
数据类型: double
| single
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
dim
- 沿其运算的维度 正整数标量
沿其运算的维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。
fft(X,[],1)
沿X
的各列进行运算,并返回每列的傅里叶变换。fft(X,[],2)
沿X
的各行进行运算,并返回每行的傅里叶变换。
如果 dim
大于 ndims(X)
,则 fft(X,[],dim)
返回 X
。当指定 n
时,fft(X,n,dim)
将对 X
进行填充或截断,以使维度 dim
的长度为 n
。
数据类型: double
| single
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
输出参数
Y
- 频域表示 向量 | 矩阵 | 多维数组
频域表示,以向量、矩阵或多维数组形式返回。
如果 X
的类型为 single
,则 fft
本身以单精度进行计算,Y
的类型也是 single
。否则,Y
以 double
类型返回。
Y
的大小如下:
对于
Y = fft(X)
或Y = fft(X,[],dim)
,Y
的大小等于X
的大小。对于
Y = fft(X,n,dim)
,size(Y,dim)
的值等于n
,而所有其他维度的大小保持与在X
中相同。
如果 X
为实数,则 Y
是共轭对称的,且 Y
中特征点的数量为 ceil((n+1)/2)
。
数据类型: double
| single
详细信息
向量的离散傅里叶变换
Y = fft(X)
和 X = ifft(Y)
分别实现傅里叶变换和逆傅里叶变换。对于长度 n
的 X
和 Y
,这些变换定义如下:
Y(k)=nj=1X(j) W(j−1)(k−1)nX(j)=1nnk=1Y(k) Wn−(j−1)(k−1),
其中
Wn=e(−2πi)/n
为 n 次单位根之一。
提示
fft
的执行时间取决于变换的长度。仅具有小质因数的变换长度的 fft 执行时间明显快于本身是质数或具有较大质因数的变换长度的 fft 执行时间。对于大多数
n
值,实数输入的 DFT 需要的计算时间大致是复数输入的 DFT 计算时间的一半。但是,当n
有较大的质因数时,速度很少有差别或没有差别。使用工具函数
fftw
可能会提高fft
的速度。此函数控制用于计算特殊大小和维度的 FFT 算法优化。
参考
[1] FFTW (http://www.fftw.org
)
[2] Frigo, M., and S. G. Johnson. “FFTW: An Adaptive Software Architecture for the FFT.” Proceedings of the International Conference on Acoustics, Speech, and Signal Processing. Vol. 3, 1998, pp. 1381-1384.
扩展功能
C/C++ 代码生成 使用 MATLAB Coder 生成 C 代码和 C++ 代码。
用法说明和限制:
有关可变大小数据的限制,请参阅Variable-Sizing Restrictions for Code Generation of Toolbox Functions (MATLAB Coder)。
对于 MEX 输出,MATLAB Coder 使用 MATLAB 用于 FFT 算法的库。对于独立的 C/C++ 代码,默认情况下,代码生成器生成用于 FFT 算法的代码,而不是生成 FFT 库调用。要生成对安装的特定 FFTW 库的调用,请提供 FFT 库回调类。有关 FFT 库回调类的详细信息,请参阅
coder.fftw.StandaloneFFTW3Interface
。对于 MATLAB Function 模块的仿真,仿真软件使用 MATLAB 用于 FFT 算法的库。对于 C/C++ 代码生成,默认情况下,代码生成器生成用于 FFT 算法的代码,而不是生成 FFT 库调用。要生成对安装的特定 FFTW 库的调用,请提供 FFT 库回调类。有关 FFT 库回调类的详细信息,请参阅
coder.fftw.StandaloneFFTW3Interface
。
GPU 数组 通过使用 Parallel Computing Toolbox 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
即使所有虚部都为零,输出
Y
也始终为复数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组 使用 Parallel Computing Toolbox 在群集的组合内存中对大型数组进行分区。
用法说明和限制:
对于分布式数组,
fft
不使用并行 FFT 算法,而是在单个工作进程上收集向量以执行质数长度 FFT。对于质数长度较大的向量 FFT,可能导致内存不足错误。
有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
在 R2006a 之前推出
matlab中fft快速傅里叶变换的更多相关文章
- [C++] 频谱图中 FFT快速傅里叶变换C++实现
在项目中,需要画波形频谱图,因此进行查找,不是很懂相关知识,下列代码主要是针对这篇文章. http://blog.csdn.net/xcgspring/article/details/4749075 ...
- OI中的快速傅里叶变换(FFT)
快速傅里叶变换(FFT) ---- LLpp ...
- MATLAB中FFT的使用方法
MATLAB中FFT的使用方法 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X, ...
- FFT 快速傅里叶变换 学习笔记
FFT 快速傅里叶变换 前言 lmc,ikka,attack等众多大佬都没教会的我终于要自己填坑了. 又是机房里最后一个学fft的人 早背过圆周率50位填坑了 用处 多项式乘法 卷积 \(g(x)=a ...
- 「学习笔记」FFT 快速傅里叶变换
目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔 ...
- CQOI2018 九连环 打表找规律 fft快速傅里叶变换
题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...
- MATLAB中fft函数的正确使用方法
问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...
- FFT —— 快速傅里叶变换
问题: 已知A[], B[], 求C[],使: 定义C是A,B的卷积,例如多项式乘法等. 朴素做法是按照定义枚举i和j,但这样时间复杂度是O(n2). 能不能使时间复杂度降下来呢? 点值表示法: 我们 ...
- [转载]Matlab中fft与fftshift命令的小结与分析
http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术 ...
随机推荐
- Tesselation学习
Tesselation的作用:给低片面数模型镶嵌更多片面,让低模变高模. 和法线贴图不同,法线本质是通过改变低模表面的颜色来模拟高模,比如在一个片面上普通diffuse是均匀的颜色分布(因为光照颜色一 ...
- 深入了解Netty【六】Netty工作原理
引言 前面学习了NIO与零拷贝.IO多路复用模型.Reactor主从模型. 服务器基于IO模型管理连接,获取输入数据,又基于线程模型,处理请求. 下面来学习Netty的具体应用. 1.Netty线程模 ...
- eslint prettier vetur eslint
VScode (版本 1.47.3)安装 eslint prettier vetur 插件 .vue 文件使用 vetur 进行格式化 在文件 .prettierrc 里写 属于你的 pettier ...
- 【阿里云训练营】python查漏补缺 1
文章来自:微信公众号[机器学习炼丹术]. 有问题疑惑,或者想交流交朋友的可以加个人微信:cyx645016617 参考目录: 目录 1 注释 2 is 与 == 3 运算优先级 4 查找所有属性和方法 ...
- DVWA_sql injection(low)
这里主要记录下做题时的思路以及步骤,不查看源码也不对源码进行分析.(我这个dvwa是一个在线靶场,所以我也不确定是否与本地靶场有些许出入) 1.Low 将难度调为Low级别后,来到如下界面 首先输入一 ...
- 项目实战 - 原理讲解<-> Keras框架搭建Mtcnn人脸检测平台
Mtcnn它是2016年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测.这三个级联的网络分别是快速生成 ...
- Oracle中创建千万级大表归纳
从一月至今,我总共归纳了三种创建千万级大表的方案,它们是: 下面是这三种方案的对比表格: # 名称 地址 主要机制 速度 1 在Oracle中十分钟内创建一张千万级别的表 https://www.cn ...
- leetcode刷题-51N皇后
题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解法包含一个明确的 n 皇后问 ...
- Navicat Premium 15.0.17 破解激活(DFoX 注册机)
Navicat Premium v15.0.17 安装程序和注册机已放入百度网盘,下载地址在本文最后 1. 下载并安装 Navicat Premium 15 在官网下载 Windows 版本的 Nav ...
- Java实现简单混合计算器
这个计算器并不是基于逆波兰实现的,而是通过简单的递归,一层一层地计算最终求得结果. 具体的图形化界面可以参考我的另外一个篇博客:基于逆波兰表达式实现图形化混合计算器,这里我只是简单的介绍一下怎样求得算 ...