fft
快速傅里叶变换
描述
例子
噪声信号
利用傅里叶变换找到隐藏在噪声中的信号的频率分量。
指定采样频率为1khz、信号持续时间为1.5秒的信号的参数。
Fs = 1000;%采样频率T = 1 / f;%采样周期L = 1500;信号长度%t = t (0: l - 1) *;%的时间向量
形成一个包含振幅为0.7的50hz和振幅为1的120hz正弦的信号。
S = 0.7*sin(2* *50*t) + sin(2* *120*t);
用方差为4的零均值白噪声破坏信号。
X = S + 2*randn(size(t));
在时域内绘制噪声信号。单看信号很难识别频率分量X (t)
.
情节(1000 * t (1:50) X(1:50))标题(“零均值随机噪声破坏信号”)包含(“t(毫秒)”) ylabel (“X (t)”)
计算信号的傅里叶变换。
Y = fft (X);
计算双边谱P2
.然后计算单侧谱P1
基于P2
和偶值信号长度l
.
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 = f * (0: (L / 2)) / L;情节(f, P1)标题(X(t)的单边振幅谱)包含(“f (Hz)”) ylabel (“| P1 (f) |”)
现在,对原始的,未损坏的信号进行傅里叶变换并得到准确的振幅,0.7和1.0。
Y = fft(年代);P2 = abs (Y / L);P1, P2 (1: L / 2 + 1);P1 (2: end-1) = 2 * P1 (2: end-1);情节(f, P1)标题(S(t)单边振幅谱)包含(“f (Hz)”) ylabel (“| P1 (f) |”)
高斯脉冲
将一个高斯脉冲从时域转换到频域。
指定采样频率为44.1 kHz、信号持续时间为1 ms的信号的参数。创建一个标准偏差为0.1毫秒的高斯脉冲。
Fs = 44100;%采样频率T = 1 / f;%采样周期t = -0.5: 0.5;%的时间向量L =长度(t);%信号长度X = 1 /(0.4 *√(2 *π))* (exp (- t ^ 2 / (2 * (0.1 * 1 e - 3) ^ 2)));
在时域上画出脉冲。
情节(t, X)标题(时域高斯脉冲)包含(“时间(t)”) ylabel (“X (t)”轴([-1e-3 1e-3 0 1.1])
的执行时间fft
取决于转换的长度。只有小素数因子的转换长度比那些有大素数因子的转换长度的执行时间要快得多。
在这个例子中,是信号长度l
是44101,这是一个非常大的质数。提高…的性能fft
,确定一个输入长度,该输入长度是原始信号长度的下一个2次方。调用fft
用这个输入长度垫住脉冲X
带有到指定转换长度的末尾零。
n = 2 ^ nextpow2 (L);
将高斯脉冲转换到频域。
Y = fft (X, n);
定义频域并绘制唯一频率。
f = f * (0: (n / 2)) / n;P = abs (Y / n) ^ 2;情节(f P (1: n / 2 + 1)标题(频域高斯脉冲)包含(“f (Hz)”) ylabel (“| P (f) | ^ 2”)
余弦波
比较时域和频域的余弦波。
指定采样频率为1khz、信号持续时间为1秒的信号的参数。
Fs = 1000;%采样频率T = 1 / f;%采样周期L = 1000;信号长度%t = t (0: l - 1) *;%的时间向量
创建一个矩阵,其中每一行代表一个频率缩放的余弦波。结果,X
为3 × 1000矩阵。第一行的波频率为50,第二行的波频率为150,第三行的波频率为300。
x1 = cos(2 *π* 50 * t);%第一排波x2 = cos(2 *π* 150 * t);%第二行波x3 = cos(2 *π* 300 * t);%第三行波X = [x1;x2;x3);
的每一行的前100个元素X
在一个图中按顺序排列并比较它们的频率。
为i = 1:3次要情节(3、1,i)情节(t (1:10 0) X(我,1:10 0))标题(“行”+ num2str(我)+"在时域内")结束
指定昏暗的
参数使用fft
沿着一排排X
,即对每个信号。
昏暗的= 2;
计算信号的傅里叶变换。
Y = fft (X, L,昏暗的);
计算每个信号的双面谱和单面谱。
P2 = abs (Y / L);P1, P2 (: 1: L / 2 + 1);P1 (: 2: end-1) = 2 * P1 (:, 2: end-1);
在频域,绘制单幅图中每一行的单面振幅谱。
为i = 1:3次要情节(3、1,i)图(0:(Fs / L): (Fs / 2 - f / L), P1(我,1:L / 2)标题(“行”+ num2str(我)+"在频域")结束
阶段的正弦曲线
创建一个由两个频率为15hz和40hz的正弦信号组成的信号。第一个正弦是有相位的余弦波 ,第二种是有相位的余弦波 .采样信号在100赫兹1秒。
Fs = 100;t = 0:1 / Fs: 1 - 1 / f;x = cos(2 *π* 15 * t -π/ 4)+ cos(2 *π* 40 * t +π/ 2);
计算信号的傅里叶变换。画出变换的幅度作为频率的函数。
y = fft (x);z = fftshift (y);ly =长度(y);f =(以某方式/ 2:ly / 2 - 1) / ly * Fs;茎(f、abs (z))标题(x(t)的双面振幅谱)包含(“频率(赫兹)”) ylabel (“y | |”网格)
计算变换的相位,去除小幅度变换值。把相位画成频率的函数。
托尔= 1 e-6;Z (abs(Z) < tol) = 0;θ=角(z);茎(f,θ/ pi)标题(x(t)的相位谱)包含(“频率(赫兹)”) ylabel (“阶段/ \π”网格)
插值FFT的
通过填充零来插值信号的傅里叶变换。
设置采样频率为80hz,信号持续时间为0.8 s的信号参数。
Fs = 80;T = 1 / f;L = 65;t = t (0: l - 1) *;
创建一个叠加的2赫兹正弦信号和它的更高的谐波。信号包含2hz余弦波、4hz余弦波和6hz正弦波。
X = 3 * cos(2 *π* 2 * t) + 2 * cos(2 * 4π* * t) +罪(2 *π* 6 * t);
在时域中画出信号。
情节(t, X)标题(“时域信号叠加”)包含(“t”(ms)) ylabel (“X (t)”)
计算信号的傅里叶变换。
Y = fft (X);
计算信号的单边振幅谱。
f = f * (0: (L - 1) / 2) / L;P2 = abs (Y / L);P1, P2 (1: (L + 1) / 2);P1(2:结束)= 2 * P1(2:结束);
在频域,绘制单侧频谱。由于信号的时间采样时间很短,傅里叶变换的频率分辨率不够精确,无法显示4hz附近的峰值频率。
情节(f, P1,“o”)标题(“原始信号单侧频谱”)包含(“f (Hz)”) ylabel (“| P1 (f) |”)
为了更好地评估峰值频率,可以通过用零填充原始信号来增加分析窗口的长度。该方法自动插值信号的傅里叶变换具有更精确的频率分辨率。
确定一个新的输入长度,它是原信号长度的下一个2次方。垫的信号X
用后面的零来扩展它的长度。计算加零信号的傅里叶变换。
n = 2 ^ nextpow2 (L);Y = fft (X, n);
计算填充信号的单边振幅谱。因为信号长度n
从65增加到128,频率分辨率变为Fs / n
,即0.625 Hz。
f = f * (0: (n / 2)) / n;P2 = abs (Y / L);P1, P2 (1: n / 2 + 1);P1 (2: end-1) = 2 * P1 (2: end-1);
绘制填充信号的单侧频谱图。这个新的频谱显示了在0.625 Hz的频率分辨率内,2hz、4hz和6hz附近的峰值频率。
情节(f, P1,“o”)标题(“填充信号的单边频谱”)包含(“f (Hz)”) ylabel (“| P1 (f) |”)
输入参数
X
- - - - - -输入数组
向量|矩阵|多维数组
输入数组,指定为向量、矩阵或多维数组。
如果X
是一个空的0 × 0矩阵吗fft (X)
返回一个空的0 × 0矩阵。
数据类型:双
|单
|int8
|int16
|int32
|uint8
|uint16
|uint32
|逻辑
复数的支持:是的
n
- - - - - -变换长度
[]
(默认)|非负整数标量
转换长度,指定为[]
或者一个非负整数标量。为转换长度指定一个正整数标量可以提高的性能fft
.长度通常指定为2的幂或可以分解成小素数(素数因数不大于7)的乘积的值n
小于信号的长度,那么fft
方法之后的其余信号值将被忽略n
,并返回截断后的结果。如果n
是0
,然后fft
返回一个空矩阵。
例子:n = 2 ^ nextpow2(大小(X, 1))
数据类型:双
|单
|int8
|int16
|int32
|uint8
|uint16
|uint32
|逻辑
昏暗的
- - - - - -操作沿的尺寸
正整数标量
要操作的维度,指定为正整数标量。如果不指定维度,则默认为大小大于1的第一个数组维度。
fft (X, [], 1)
沿着的列运算X
并返回每一列的傅里叶变换。fft (X, [], 2)
沿着行的运算X
并返回每一行的傅里叶变换。
如果昏暗的
大于ndims (X)
,然后fft (X,[],昏暗的)
返回X
.当n
是指定的,fft (X, n,昏暗的)
垫或截断X
长度n
沿着维度昏暗的
.
数据类型:双
|单
|int8
|int16
|int32
|uint8
|uint16
|uint32
|逻辑
输出参数
Y
-频域表示
向量|矩阵|多维数组
作为向量、矩阵或多维数组返回的频域表示。
如果X
的类型是单
,然后fft
本机计算单精度,和Y
也是类型单
.否则,Y
作为类型返回双
.
的大小Y
如下:
为
Y = fft (X)
或Y = fft (X,[],昏暗的)
的大小。Y
等于的大小X
.为
Y = fft (X, n,昏暗的)
的价值。大小(Y,昏暗的)
等于n
,而所有其他维度的大小保持为X
.
如果X
是真实的,那么Y
共轭对称吗,唯一点的个数是多少Y
是装天花板((n + 1) / 2)
.
数据类型:双
|单
更多关于
向量的离散傅里叶变换
Y = fft (X)
而且X =传输线(Y)
分别实现傅里叶变换和傅里叶反变换。为X
而且Y
的长度n
,这些变换定义如下:
在哪里
是其中之一n根的团结。
提示
的执行时间
fft
取决于转换的长度。只有小素数因子(不大于7)的转换长度比那些有素数因子或有大素数因子的转换长度的执行时间要快得多。的大多数值
n
,实输入dft的计算时间大约是复输入dft的一半。然而,当n
有较大的质因数,几乎没有速度差异。你可以潜在地提高速度
fft
使用效用函数fftw
.该函数控制用于计算特定尺寸和尺寸的FFT的算法的优化。
参考文献
[1] FFTW (https://www.fftw.org)
弗里戈,M.和S. G.约翰逊。FFTW: FFT的自适应软件架构。声学、语音和信号处理国际会议论文集.1998年第3卷,第1381-1384页。
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
有关与可变大小数据相关的限制,请参见工具箱函数代码生成的变量大小限制(MATLAB编码器).
对墨西哥人输出,MATLAB®编码器™使用MATLAB用于FFT算法的库。对于独立的C/ c++代码,默认情况下,代码生成器为FFT算法生成代码,而不是生成FFT库调用。要生成对特定安装的FFTW库的调用,提供一个FFT库回调类。有关FFT库回调类的更多信息,请参见
coder.fftw.StandaloneFFTW3Interface
(MATLAB编码器).用于模拟MATLAB函数块,仿真软件使用MATLAB用于FFT算法的库。对于C/ c++代码生成,默认情况下,代码生成器为FFT算法生成代码,而不是生成FFT库调用。要生成对特定安装的FFTW库的调用,提供一个FFT库回调类。有关FFT库回调类的更多信息,请参见
coder.fftw.StandaloneFFTW3Interface
(MATLAB编码器).使用代码替换库(Code Replacement Library, CRL),您可以生成运行在上面的优化代码手臂®皮质®-带有Neon扩展名的处理器。要生成此优化的代码,必须安装嵌入式编码器®ARM Cortex-A处理器支持包ARM Cortex-A处理器的嵌入式编码器支持包.的生成代码手臂皮层-A使用Ne10库。有关更多信息,请参见MATLAB函数支持ARM Cortex-A处理器的Ne10条件ARM Cortex-A处理器的嵌入式编码器支持包.
使用代码替换库(Code Replacement Library, CRL),您可以生成运行在上面的优化代码手臂皮层- m处理器。要生成此优化的代码,必须安装ARM Cortex-M处理器的嵌入式编码器支持包(ARM Cortex-M处理器的嵌入式编码器支持包).的生成代码手臂皮层-M使用CMSIS库。有关更多信息,请参见MATLAB函数支持ARM Cortex-M处理器的CMSIS条件(ARM Cortex-M处理器的嵌入式编码器支持包).
GPU的代码生成
使用GPU Coder™为NVIDIA GPU生成CUDA®代码。
线程环境
在后台使用MATLAB®运行代码backgroundPool
或使用并行计算工具箱™加速代码ThreadPool
.
这个函数完全支持基于线程的环境。有关更多信息,请参见在线程环境中运行MATLAB函数.
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
分布式阵列
使用并行计算工具箱™跨集群的组合内存分区大型数组。
使用注意事项和限制:
对于分布式阵列,不使用并行FFT算法,
fft
收集单个工位上的向量来执行质数长度fft。对于较大的质数长度向量fft,可能会导致内存不足的错误。
有关更多信息,请参见运行MATLAB函数与分布式数组(并行计算工具箱).
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。