fft2MATLAB内存不足,matlab中fft快速傅里叶变换
博文来源: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 个条目之后的剩余信号值,并返回截断的结果。如果 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 算法优化。
算法
FFT 函数(fft、fft2、fftn、ifft、ifft2、ifftn)基于一个称为 FFTW [1] [2] 的库。
参考
[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++ 代码。
用法说明和限制:
对于 MEX 输出,MATLAB® Coder™ 使用 MATLAB 用于 FFT 算法的库。对于独立的 C/C++ 代码,默认情况下,代码生成器生成用于 FFT 算法的代码,而不是生成 FFT 库调用。要生成对安装的特定 FFTW 库的调用,请提供
对于 MATLAB Function 模块的仿真,仿真软件使用 MATLAB 用于 FFT 算法的库。对于 C/C++ 代码生成,默认情况下,代码生成器生成用于 FFT 算法的代码,而不是生成 FFT 库调用。要生成对安装的特定 FFTW 库的调用,请提供
GPU 数组 通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
即使所有虚部都为零,输出 Y 也始终为复数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组 使用 Parallel Computing Toolbox™ 在群集的组合内存中对大型数组进行分区。
用法说明和限制:
对于分布式数组,fft 不使用并行 FFT 算法,而是在单个工作进程上收集向量以执行质数长度 FFT。对于质数长度较大的向量 FFT,可能导致内存不足错误。
在 R2006a 之前推出
fft2MATLAB内存不足,matlab中fft快速傅里叶变换相关推荐
- matlab中利用快速傅里叶变换对股票价格进行频域分析
matlab中利用快速傅里叶变换对股票价格进行频域分析 在学习matlab的快速傅里叶变换时,发现可以用他来对股票进行相对简单的快速处理,以判断股票价格的周期规律. 采集股票信息 本文重点在于快速傅里 ...
- MATLAB中的快速傅里叶变换FFT与IFFT
背景 FFT (Fast Fourier Transform)是离散傅立叶变换的快速算法,可以将一个信号从时域变换到频域.同时与之对应的是IFFT(Inverse Fast Fourier Trans ...
- matlab中xtem,快速傅里叶变换_蝶形运算_按频率抽取基2-fft算法_MATLAB代码
function y=MyFFT_FB(x,n) %MYFFT_TB:My Fast Fourier Transform Frequency Based %按频率抽取基2-fft算法 %input: ...
- Java中实现快速傅里叶变换FFT
Java中实现快速傅里叶变换FFT 一.概述 1.傅里叶变换(FT) 2.离散傅里叶变换(DFT) 3.快速傅里叶变换(FFT) 1)单位根 2)快速傅里叶变换的思想 3)蝶形图 4)快速傅里叶变换的 ...
- FFT快速傅里叶变换的应用——画单边频谱图matlab
FFT快速傅里叶变换的应用--画单边频谱图matlab 快速傅里叶变换在数字信号处理里用的十分广泛,在matlab仿真中,处理信号的时频域变换十分有效,这里结合两个做过的仿真,来说一说fft的应用:画 ...
- matlab函数fftshift,matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法(2)
plot([0 : PointNum/2 - 1], x1(1:PointNum/2)); grid on subplot(3,1,2); % [REX IMX] am = sqrt(abs(REX. ...
- FFT快速傅里叶变换 超详细的入门学习总结
FFT快速傅里叶变换 说明 本文创作的目的是为自己巩固该算法,加深印象并深入理解,同时也为FFT入门学者提供一份可鉴的学习总结. 原文链接:https://blog.csdn.net/qq_39565 ...
- FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换
FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换,可实现FFT8192个点或改成其他FFT1024.4096等等,可以直接运行,运行结果与matlab运行的一致,写好了注释, ...
- MATLAB中FFT的使用方法(频谱分析)
原文地址:MATLAB中FFT的使用方法(频谱分析)作者:飞鸿 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法 X=FFT(x): X=FFT(x,N): ...
最新文章
- WPF学习笔记(03) - 华丽的HelloWorld
- android 前摄屏幕补光,异形显示屏及其前置摄像头的拍照补光方法与流程
- laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...
- 关键字搜索 c语言,c语言-以关键字搜索程序
- S5PV210 FirstAndroidAPP] ERROR: Application requires API version 版本不对的问题
- Shell程序设计 | 文本处理工具 :正则表达式、grep、sed、awk
- pySerial -- Python的串口通讯模块
- Win10系统添加 Win10 LTSC2019闹钟
- 400G时代即将来袭,新型光纤或为最佳拍档
- JS基础--ES5创建对象的7种模式
- 使用seafile创建个人云(类似百度云)
- 【matlab】多维向量的转置
- python身份证号码共18位_涨姿势:用Python完成15位18位身份证的互转
- 随便说说,关于电吉他这个爱好
- 深夜的呼唤,无尽的力量
- 百词斩 计算机英语词汇表,单词之美四级-英语词汇百词斩拓海有道金山词霸典...
- 【6.28校内test】T2 【音乐会】二重变革
- Leetcode 79. 单词搜索(迷宫回溯)
- 移植u-boot v2018
- 《个人助手》新模块——数据手袋