Matlab 之 FFT的理解和应用

  网上看了一些大牛的关于FFT的见解,加上自己的一点儿理解,针对以下这几个问题来加深对FFT的理解。

  不知道大家有没有类似以下几点的困惑:

问题的提出

  1. 对于1秒钟输出的连续信号,使用采样率Fs不同,就会得到不同的采样序列。在计算N点FFT之后得到N点的复数,幅频图中横坐标如何与我实际的频率相对应?
  2. FFT之后的幅频响应图,对应的幅值到底有什么含义,我们可以通过这个对应频率点的幅值推出原始信号的相关特性吗?    

问题的解释

  傅里叶是法国数学家和物理学家的名字,英语原名是Jean Baptiste Joseph Fourier(1768-1830)。他在1807年在他论文里面运用正弦曲线来描述温度分布,论文里有个在当时具有争议性的决断:任何连续周期信号都可以由一组适当的正弦曲线组合而成。

分解信号的方法是无穷多个的,为什么我们要用正弦曲线来代替原来的曲线呢?分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有原信号所不具有的性质:正弦曲线保真度。一个正余弦曲线信号输入后,输出的仍是正余弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的。(话外1)对线性系统而言,输入正弦信号,输出为同频率的正弦信号,只有附加相移和幅度变化。2)根据傅立叶变换性质,几乎全部实际信号都可以表示成傅里叶级数形式,包括正弦信号本身。可见,正弦信号是不可分的基本信号,而方波或三角波不是,所以不用方波或三角波。)且只有正余弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。

1三角函数形式的傅里叶级数

  我们来看这个式子:

  它就是傅里叶级数,周期函数f(t)的角频率为w1,可由三角函数的线性组合来表示,式中n为正整数,

  a为直流分量

  余弦分量的幅度

  正弦分量的幅度

2指数形式的傅里叶级数

  根据欧拉公式,将f(t)表示为:

  令

   那么

  f(t)指数形式的傅里叶级数为:

  

  注意:这就将0到正无穷的范围扩展到了负无穷到正无穷,就是为什么做傅里叶变化之后会出现负的频率。指数形式表示的信号频谱图中,每个分量nw1的幅度一分为2,在正负频率上相对应的位置上个为一半,所以,只有把正、负频率上对应的这两条谱线矢量相加起来才代表一个分量的幅度。复数频谱中出现的负频率是由于将sin(nw1t),cos(nw1t)写成指数形式的时,从数学观点自然分成了exp(-jnw1t)和exp(jnw1t)两项,负频率的出现完全是数学运算的结果只有把相应的正、负频率成对的合并起来,才是实际的频谱函数,。

  三角形式的傅立叶级数频率为非负的,对应的频谱一般称为单边谱,

  指数形式的傅立叶级数频率为整个实轴,所以称为双边谱。

  最后回过头来想想:f(t)的指数形式也可以说明F(nw1)是代表各个频率点上的复数信息,说明了傅里叶变化的结果就是将时域变换到的频域去分析信号。

3DFT

  接着来看一下离散傅里叶变化

  DFT合成等式

  其中

但k等于0和N/2时,实数部分的计算要用下面的等式:

  假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是的A的N/2倍。而第一个点就是直流分量,他的模值就是直流分量的N倍。

  首先,FFT(快速傅里叶变换)是一种实现DFT(离散傅里叶变换)的快速算法,是利用复数形式的离散傅里叶变换来计算实数形式的离散傅里叶变换)。

5Matlab程序举例

%%时域信号的表示,

Fs = 1000; % Sampling frequency

T = 1/Fs; % Sample time

L = 1000; % Length of signal

t = (0:L-1)*T; % Time vector

% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid

x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

y = x + 2*randn(size(t)); % Sinusoids plus noise

plot(Fs*t(1:50),y(1:50))

title(‘Signal Corrupted with Zero-Mean Random Noise‘)

xlabel(‘time (milliseconds)‘);

%%这样子横坐标代表实际时间。。

NFFT = 2^nextpow2(L); % Next power of 2 from length of y

f = Fs/2*linspace(0,1,NFFT/2+1);

%%%频域也有NFFT个点,频域中每两个点之间的间隔为Fs/NFFT;

%%%因此f的坐标设置为FS*(0:NFFT-1)/NFFT;

% Plot single-sided amplitude spectrum.

plot(f,2*abs(Y(1:NFFT/2+1)))

title(‘Single-Sided Amplitude Spectrum of y(t)‘)

xlabel(‘Frequency (Hz)‘)

ylabel(‘|Y(f)|‘)

时间: 2024-10-17 14:51:57

Matlab 之 FFT的理解和应用的相关文章

MATLAB中fft

一般的fft需要将点数补成2的整数次幂,MATLAB中有fft函数,输入N点序列则输出也是N点序列,其中N不一定为2的整数次幂.所以会疑惑MATLAB做的fft和N点序列对应的dft是否一样.经过验证,MATLAB中对N点序列做fft的结果与N点dft的结果是完全一样的,没有对N点序列进行补0后再做操作. 下面是MATLAB代码和结果. n = 0: 49; A = 444.128; a = 50 * sqrt(2.0) * pi; w0 = 50 * sqrt(2.0) * pi; T = 0

[转载]Matlab中fft与fftshift命令的小结与分析

http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术,matlab提供了强大的信号处理能力,但是有一些细节部分需要我们注意. 记信号f(t)的起始时间为t_start, 终止时间为t_end, 采样周期为t_s, 可以计算信号的持续时间Duration为 t_end – t_start, 信号离散化造成的采样点数 N = Duration/t_s +

Matlab中fft与fftshift命令的小结与分析

转载自:http://wang-yg.diandian.com/post/2011-03-12/40028916801 我们知道Fourier分析是信号处理里很重要的技术,matlab提供了强大的信号处理能力,但是有一些细节部分需要我们注意. 记信号f(t)的起始时间为t_start, 终止时间为t_end, 采样周期为t_s, 可以计算信号的持续时间Duration为 t_end – t_start, 信号离散化造成的采样点数 N = Duration/t_s + 1; 根据Fourier分析

【转】MATLAB conv2函数的理解

另附:http://blog.csdn.net/anan1205/article/details/12313593 原文:http://blog.csdn.net/andrewseu/article/details/51783181 在图像处理的过程中,经常会看到矩阵卷积的概念,比如说用一个模板去和一张图片进行卷积,因此很有必要了解矩阵卷积到了做了什么,具体又是怎么计算的. 在matlab中有conv2函数对矩阵进行卷积运算,其中有一个shape参数,取值具体有三种: -full - (defa

[转载]MATLAB中FFT的使用方法

http://blog.163.com/fei_lai_feng/blog/static/9289962200971751114547/ 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例:N=8;n=0:N-1;xn=[4 3 2 6 7 8 9 0];Xk=fft(xn) →Xk = 39.0000

Matlab学习(用matlab进行fft谐波分析)

FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原因.另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的. 虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思.如何决定要使用多少点来做FFT. 现在就根据实际经验来说说FFT结果的具体物理意义.一个模拟信号,经过ADC采样之后,就变成了数字信号.采样定理告诉我

MATLAB中FFT的使用方法

一.调用方法 X=FFT(x): X=FFT(x,N): x=IFFT(X); x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例: N=8; n=0:N-1; xn=[4 3 2 6 7 8 9 0]; Xk=fft(xn) 输出: Xk = 39.0000          -10.7782 + 6.2929i        0 -5.0000i   4.7782 - 7.7071i  5.0000            4.7782

FFT算法理解

1. DFT运算及性质 DFT计算量很大,且随N的增多急剧增加,计算量和成正比,要降低计算复杂度,就需要将DFT分解成小点数的DFT处理.在DFT分解处理中,出现了"按时间抽取的FFT"."按频率抽取的FFT",其中"按频率抽取的FFT"使用比较多,特别是基于"分裂机"的"频率抽取FFT"相对于常规的"按频率抽取"的基2 FFT要更省计算量. 1. 按时间抽取的基2 FFT算法 所谓的按

Matlab图像处理系列4———图像傅立叶变换与反变换

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内可以加工处理图像以外,我们还可以将图像变换到其他空间后进行处理,这些方法称为变换域方法,最常见的变换域是频域. 使用Fourier变换把图像从空间域变换到频域,在频域内做相应增强处理,再从频域变换到空间域得到处理后的图像. 我们这里主要学习Fourier变换和FFT变换的算法,没有学过通信原理,我对信号.时域分析也不是很清楚. 2.FFT算法 (1)离散Fourier变