MATLAB 快速傅里叶变换(fft)结果为什么是复数?

文章核心是两部分:
(1)从直观和本质的角度,说明为什么快速傅里叶变换的结果是复数;
(2)详细说明了MATLAB中fft函数的运用方法,并给出了fft幅度谱的求解代码。
但要真正了解快速傅里叶变换,核心是理解“FFT的计算原理”!!!


目录

一、直观解释

二、本质原因之FFT的计算原理 (关键)

三、MATLAB中fft函数说明

函数形式

参数说明

四、 FFT求频率-幅值谱的MATLAB 代码

五、扩展阅读


一、直观解释

第一,从定义式上看,积分号里含有复数,积分结果是复数;

第二,从傅立叶变换的物理意义上看:傅里叶变换是将一个信号分解为多个信号之和的形式,并且是正弦或余弦信号叠加的形式。决定一个正弦波x=Asin(\omega t+\psi ),需要频率、振幅和相位,三者缺一不可,其中频率由x轴给出,而振幅和相位可以由复数准确表达。对于 复数 a+bi,其振幅 和相位 \psi 如下:(注:MATLAB中fft函数的结果即采用这样这种方式表达

A=\sqrt(a^2+b^2)

\psi=\arctan (b/a)

 

PS 来源:百度知道,但有部分修改!


二、本质原因之FFT的计算原理 (关键)

要从本质上解释为什么快速傅里叶变换的结果是复数,需要理解快速傅里叶变换的计算原理。可参考如下两个帖子,写的十分优秀且详细!个人理解,后续再更!

(1)超详细易懂FFT(快速傅里叶变换)及代码实现

(2)快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)


三、MATLAB中fft函数说明

以下内容在MATLAB快速傅里叶变换(fft)函数详解的基础上修改!

函数形式

​​(1)  Y = fft(y);

(2) Y = fft(y,N);

式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。

参数说明

1.  函数fft返回值的数据结构具有对称性

根据采样定理,fft能分辨的最高频率为采样频率的一半(即Nyquist频率),函数fft返回值是以Nyqusit频率为轴对称的,Y的前一半与后一半是复数共轭关系(复数共轭是因为快速傅里叶变换计算中单位根之间的复数共轭关系)。

2.  幅值

作FFT分析时,幅值大小与输入点数有关,要得到真实的幅值大小,只要将变换后的结果乘以2除以N即可(此时得到的单边谱),但此时单边谱的“零频分量”的幅值为实际值的2倍。对此的解释是:Y除以N得到双边谱,再乘以2得到单边谱,但零频在双边谱中本没有被一分为二,而转化为单边谱过程中所有幅值均乘以2,所以零频被放大了。在求解过程中,可以通过 P1(2:end-1) = 2*P1(2:end-1) 有效去除零频放大的问题。

3.  基频

​若分析数据时长为T,则分析结果的基频就是f0=1/T,分析结果的频率序列为[0:LF-1]*f0

4.  执行N点FFT

在调用格式2中,函数执行N点FFT。若y为向量且长度小于N,则函数将y补零至长度N,若向量y的长度大于N,则函数截断y使之长度为N。使用N点FFT时,若N大于向量y的长度,将给频谱分析结果带来变化,应该特别注意,具体影响见下图。

MATLAB 快速傅里叶变换(fft)结果为什么是复数?_第1张图片


四、 FFT求频率-幅值谱的MATLAB 代码

clc;
clear;
close all;
 
% 原信号
t = 0:0.01:2;
fs = 1 /0.01; % 采样频率
x = chirp(t,100,1,200,'quadratic');
LF=length(x);

% 傅里叶变换
xf_o=fft(x); % 傅里叶变换的结果是对称的,原因单位根之间存在复共轭,具体请阅读第二部分“FFT的计算原理”
f_o=(1:LF).*fs/LF; % 频率轴
xf_oc=fftshift(xf_o); % 将零频移动到输出的中心位置
f_oc=(floor(-LF/2):floor(LF/2)-1).*fs/LF;  % 频率轴

figure
subplot(311)
plot(t,x)
title('输入信号');xlabel('Time');ylabel('Amplitude');
subplot(312)
plot(f_o,xf_o) % xf_o是复数,但图形仅画实部,忽略虚部。
title('fft结果');xlabel('Frequency');ylabel('Real part of fft');
subplot(313)
plot(f_oc,xf_oc)
title('零频移动到输出中心的fft结果');xlabel('Frequency');ylabel('Real part of fft');


% 双边谱
xf_da=abs(xf_oc)/LF; % 归一化后的双边谱
f_d=(floor(-LF/2):floor(LF/2)-1).*fs/LF; % 频率轴

% 单边谱
xf_s=abs(xf_o)/LF; % 归一化的谱
xf_sa=xf_s(1:floor(LF/2)+1); 
xf_sa(2:end-1)=2*xf_sa(2:end-1); % 单边谱,且去除零频放大效应!
f_s=fs*(0:floor(LF/2))/LF; % 频率轴,根据采样定理,Nyquist频率是采样频率的一半!单位'Hz'

% 相位谱
xf_dp=angle(xf_o); % 单位是“弧度” ,与[xf_dp=phase(xf_o)]等价!
xf_p=xf_dp(1:floor(LF/2)+1); % 相位谱

figure
subplot(311)
plot(f_d,xf_da)
title('fft 双边频率-幅度谱');xlabel('Frequency');ylabel('Magnitude');
subplot(312)
plot(f_s,xf_sa)
title('fft 单边频率-幅度谱');xlabel('Frequency');ylabel('Magnitude');
subplot(313)
plot(f_s,xf_p)
title('fft 相位谱');xlabel('Frequency');ylabel('Phase (rad)');

结果1:fft的直接计算结果,仅画出实部,忽略虚部。结合第三部分参数说明“1函数fft返回值的数据结构具有对称性”理解。至于为什么对称,需要了解fft的计算原理!

MATLAB 快速傅里叶变换(fft)结果为什么是复数?_第2张图片

结果2:简单而言,fft单边谱是双边谱的两倍,但需注意“零频”的放大效应!结合第三部分参数说明“2.  幅值”理解

MATLAB 快速傅里叶变换(fft)结果为什么是复数?_第3张图片


五、扩展阅读

(1)傅里叶变换概念及公式推导

(2)MATLAB中的快速傅里叶变换FFT与IFFT

(3)关于FFT的相位谱

(4)How to interpret FFT results – obtaining magnitude and phase information

你可能感兴趣的:(Signal,Processing,MATLAB)