matlab中fft快速傅里叶变换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

matlab中fft快速傅⾥叶变换
视频来源很好的解释了:
1 .傅⾥叶变换过程,经过傅⾥叶变化得到了,频率w,振幅a0,相位⾓φ;
2. 傅⾥叶变换主要应⽤领域:声⾳,图像处理;
博⽂则很好的解释了:
1. 傅⾥叶变换在matlab软件中怎样应⽤
2.. 傅⾥叶变换的作⽤效果的展⽰,从时域到频域的变化,时域难以解决的问题到频域中却很清晰。

语法
说明
= fft()⽤快速傅⾥叶变换 (FFT) 算法计算X的 (DFT)。

如果X是向量,则fft(X)返回该向量的傅⾥叶变换。

如果X是矩阵,则fft(X)将X的各列视为向量,并返回每列的傅⾥叶变换。

如果X是⼀个多维数组,则fft(X)将沿⼤⼩不等于 1 的第⼀个数组维度的值视为向量,并返回每个向量的傅⾥叶变换。

= fft(,)返回n点 DFT。

如果未指定任何值,则Y的⼤⼩与X相同。

如果X是向量且X的长度⼩于n,则为X补上尾零以达到长度n。

如果X是向量且X的长度⼤于n,则对X进⾏截断以达到长度n。

如果X是矩阵,则每列的处理与在向量情况下相同。

如果X为多维数组,则⼤⼩不等于 1 的第⼀个数组维度的处理与在向量情况下相同。

= fft(,,)返回沿维度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 ,这些变换定义如下:
其中
为 n 次单位根之⼀。

提⽰
fft 的执⾏时间取决于变换的长度。

仅具有⼩质因数的变换长度的 fft 执⾏时间明显快于本⾝是质数或具有较⼤质因数的变换长度的 fft 执⾏时间。

对于⼤多数 n 值,实数输⼊的 DFT 需要的计算时间⼤致是复数输⼊的 DFT 计算时间的⼀半。

但是,当 n 有较⼤的质因数时,速度很少有差别或没有差别。

使⽤⼯具函数 可能会提⾼ fft 的速度。

此函数控制⽤于计算特殊⼤⼩和维度的 FFT 算法优化。

算法
FFT 函数(fft 、fft2、fftn 、ifft 、ifft2、ifftn )基于⼀个称为 FFTW 的库。

参考
[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++ 代码。

Y(k)=n
W n =e (−2πi)/n
⽤法说明和限制:
有关可变⼤⼩数据的限制,请参阅 (MATLAB Coder)。

对于 MEX 输出,MATLAB® Coder™ 使⽤ MATLAB ⽤于 FFT 算法的库。

对于独⽴的 C/C++ 代码,默认情况下,代码⽣成器⽣成⽤于 FFT 算法的代码,⽽不是⽣成 FFT 库调⽤。

要⽣成对安装的特定 FFTW 库的调⽤,请提供 FFT 库回调类。

有关 FFT 库回调类的详细信息,请参阅。

对于 MATLAB Function 模块的仿真,仿真软件使⽤ MATLAB ⽤于 FFT 算法的库。

对于 C/C++ 代码⽣成,默认情况下,代码⽣成器⽣成⽤于 FFT 算法的代码,⽽不是⽣成 FFT 库调⽤。

要⽣成对安装的特定 FFTW 库的调⽤,请提供 FFT 库回调类。

有关 FFT 库回调类的详细信息,请参阅。

GPU 数组通过使⽤ Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运⾏来加快代码执⾏。

⽤法说明和限制:
即使所有虚部都为零,输出Y也始终为复数。

有关详细信息,请参阅 (Parallel Computing Toolbox)。

分布式数组使⽤ Parallel Computing Toolbox™ 在群集的组合内存中对⼤型数组进⾏分区。

⽤法说明和限制:
对于分布式数组,fft不使⽤并⾏ FFT 算法,⽽是在单个⼯作进程上收集向量以执⾏质数长度 FFT。

对于质数长度较⼤的向量 FFT,可能导致内存不⾜错误。

有关详细信息,请参阅 (Parallel Computing Toolbox)。

另请参阅
| | | |
主题
在 R2006a 之前推出。

相关文档
最新文档