视频来源: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.. 傅里叶变换的作用效果的展示,从时域到频域的变化,时域难以解决的问题到频域中却很清晰。

 

说明

示例

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,2) 返回每行的 n 点傅里叶变换。

 

示例

全部折叠

噪声信号

使用傅里叶变换求噪声中隐藏的信号的频率分量。

指定信号的参数,采样频率为 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 个条目之后的剩余信号值,并返回截断的结果。如果 n0,则 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。否则,Ydouble 类型返回。

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) 分别实现傅里叶变换和逆傅里叶变换。对于长度 nXY,这些变换定义如下:

Y(k)=nj=1X(j) W(j−1)​(k−1)nX(j)=1nnk=1Y(k) Wn−(j−1)​(k−1),

其中

Wn=e(−2πi)/n

为 n 次单位根之一。

提示

  • fft 的执行时间取决于变换的长度。仅具有小质因数的变换长度的 fft 执行时间明显快于本身是质数或具有较大质因数的变换长度的 fft 执行时间。

  • 对于大多数 n 值,实数输入的 DFT 需要的计算时间大致是复数输入的 DFT 计算时间的一半。但是,当 n 有较大的质因数时,速度很少有差别或没有差别。

  • 使用工具函数 fftw 可能会提高 fft 的速度。此函数控制用于计算特殊大小和维度的 FFT 算法优化。

算法

FFT 函数(fftfft2fftnifftifft2ifftn)基于一个称为 FFTW [1] [2] 的库。

参考

[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)。

另请参阅

fft2 | fftn | fftshift | fftw | ifft

在 R2006a 之前推出

matlab中fft快速傅里叶变换的更多相关文章

  1. [C++] 频谱图中 FFT快速傅里叶变换C++实现

    在项目中,需要画波形频谱图,因此进行查找,不是很懂相关知识,下列代码主要是针对这篇文章. http://blog.csdn.net/xcgspring/article/details/4749075 ...

  2. OI中的快速傅里叶变换(FFT)

    快速傅里叶变换(FFT)                                                                               ---- LLpp ...

  3. MATLAB中FFT的使用方法

    MATLAB中FFT的使用方法 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X, ...

  4. FFT 快速傅里叶变换 学习笔记

    FFT 快速傅里叶变换 前言 lmc,ikka,attack等众多大佬都没教会的我终于要自己填坑了. 又是机房里最后一个学fft的人 早背过圆周率50位填坑了 用处 多项式乘法 卷积 \(g(x)=a ...

  5. 「学习笔记」FFT 快速傅里叶变换

    目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔 ...

  6. CQOI2018 九连环 打表找规律 fft快速傅里叶变换

    题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...

  7. MATLAB中fft函数的正确使用方法

    问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...

  8. FFT —— 快速傅里叶变换

    问题: 已知A[], B[], 求C[],使: 定义C是A,B的卷积,例如多项式乘法等. 朴素做法是按照定义枚举i和j,但这样时间复杂度是O(n2). 能不能使时间复杂度降下来呢? 点值表示法: 我们 ...

  9. [转载]Matlab中fft与fftshift命令的小结与分析

    http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术 ...

随机推荐

  1. Android(java)开发之将double类型,强制保留到小数点后两位解决方法。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 前提:当我们进行double数据类型与double进行运算的时候,可能会遇到 得到小数点后好多位,但是 ...

  2. Pinpoint 一款强大的APM工具

    背景 程序的监控一直是程序员最头痛的事情之一,现网程序有问题怎么办?看进程看端口 top/free/df 三件套?网络抓包?看日志?所以为了满足这些初级需求很多公司都做了主机监控,进程端口监听等功能, ...

  3. 用笛卡尔积来创建一千六百万大表 整体19分钟 大表建成两分钟 设置id13分钟

    昨天拙文中讲述了用自增方式创建一千六百万大表的方案,这回讨论的是用笛卡儿积,实践证明这种方案更快. 2020年3月15日08点58分实验开始 创建仅有四千数据的tb_4thousand1表: SQL& ...

  4. BIO应用-RPC框架

    为什么要有RPC?  我们最开始开发的时候,一个应用一台机器,将所有功能都写在一起,比如说比较常见的电商场景. 随着我们业务的发展,我们需要提示性能了,我们会怎么做?将不同的业务功能放到线程里来实现异 ...

  5. upstream--负载

    语法格式: upstream 负载名 { [ip_hash;] server ip:port  [weight=数字]  [down]; server ip:port  [weight=数字]; } ...

  6. 为什么选择H5游戏开发定制?

    为什么选择H5游戏开发定制? 随着微信H5游戏推广带来的显著效果,越来越多的商家已经加入到游戏营销的队伍中来, 对H5小游戏有了解的商家都知道,[模板游戏]的价格往往低于[定制游戏]的价格,可是为什么 ...

  7. [PyTorch 学习笔记] 6.2 Normalization

    本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson6/bn_and_initialize.py https: ...

  8. Linux下Python3.6的安装及避坑指南

    Python3的安装 1.安装依赖环境 Python3在安装的过程中可能会用到各种依赖库,所以在正式安装Python3之前,需要将这些依赖库先行安装好. yum -y install zlib-dev ...

  9. tcp建立连接为什么需要三次握手和四次挥手

    前言 众所周知tcp传输层协议在建立连接的时候需要三次才能建立起一个真正的可靠连接,可是为什么是三次呢,不可以是两次,四次等等呢,可以自己思考一番,带着疑问可以看下文. 三次握手 在<计算机网络 ...

  10. Charles抓包工具的用途及应用

    Charles抓包工具的用途: 排查问题,测试异常情况 注意:Charles不能直接抓https请求的包,需要用https://www.jianshu.com/p/ec0a38d9a8cf这个方法去配 ...