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

您所在的位置:网站首页 什么是双边序列 MATLAB 快速傅里叶变换(fft)结果为什么是复数?

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

2024-01-04 16:53| 来源: 网络整理| 查看: 265

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

目录

一、直观解释

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

三、MATLAB中fft函数说明

函数形式

参数说明

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

五、扩展阅读

一、直观解释

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

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

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

\psi=\arctan (b/a)

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

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

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

十分简明易懂的FFT(快速傅里叶变换)

快速傅里叶变换(FFT)详解

三、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的长度,将给频谱分析结果带来变化,应该特别注意,具体影响见下图。

四、 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的计算原理!

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

五、扩展阅读

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

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

(3)关于FFT的相位谱

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3