一、快速傅里叶变换
1.语法
Y = fft(X)
Y = fft(X,n)
Y = fft(X,n,dim)
2.说明
(1)Y = fft(X)
使用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。Y 与 X 的大小相同。
如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。
如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。
如果 X 是一个多维数组,则 fft(X) 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。
(2)Y = fft(X,n)
返回 n 点 DFT。
如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n。
如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n。
如果 X 是矩阵,则每列的处理与在向量情况下相同。
如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。
(3)Y = fft(X,n,dim)
返回沿维度 dim 的傅里叶变换。例如,如果 X 是矩阵,则 fft(X,n,2) 返回每行的 n 点傅里叶变换。
二、实数信号的FFT
1.采样点为偶数的情况
(1)单边谱
经过FFT之后的频率对应的幅值并不是真实的幅值,想要将FFT之后的频谱图跟实际的幅值对应,就要进行相应的转换。频率序号为0和N2\frac{N}{2}2N的两个点的带宽只占中间频率点的一半,也就是占1N\frac{1}{N}N1的带宽,因此只需要将幅值乘以 1N\frac{1}{N}N1即可。
代码如下:
% DrawRealFFT:绘制实数信号的FFT
% N为偶数(最好为2的整数次方)
function [MagY,f] = DrawRealFFT(RealData, fs)
N = length(RealData);
fft_RealData = fft(RealData);
MagY = abs(fft_RealData(1:N/2+1));
MagY(1)=MagY(1)/N; % 频率为0的位置除以N
MagY(end)=MagY(end)/N; % 频率为Fs/2的位置也除以N
MagY(2:end-1)=2*MagY(2:end-1)/N; % 其余频率点乘以2/N
f = (0:N/2)'*fs/N;
plot(f,MagY);
grid on;
xlabel('f(Hz)'), ylabel('幅度');
end