傅里叶变换是一种线性积分变换,用于信号在时域(或空域)和频域之间的变换,在物理学和工程学中有许多应用。

1.傅里叶级数

先从傅里叶级数讲起,任何周期函数都可以展开为正弦和余弦函数的和。

周期为2



的 f(x), 能展开成,





java傅里叶变换包 maple傅里叶变换_matlab短时傅里叶变换


或者写成



其中Fn为复振幅。

2. 连续傅里叶变换

继续延申傅里叶级数的思想,计算连续傅里叶变换,即把用积分代替求和。

连续傅里叶变换将可积函数 f(t) 成 复指数函数的积分或级数形式。


java傅里叶变换包 maple傅里叶变换_matlab 离散傅里叶变换_02


傅里叶变换逆变换为


java傅里叶变换包 maple傅里叶变换_matlab 离散傅里叶变换_03


代表角频率。


3. 离散傅里叶变换

类似的,离散时间信号x(n) 的离散傅里叶变换DTFT (Dicrete time Fourier transform)可以写为


java傅里叶变换包 maple傅里叶变换_matlab求傅里叶级数展开式_04


逆变换为


java傅里叶变换包 maple傅里叶变换_java傅里叶变换包_05


表示频谱,一般为复数。注意DTFT中,时域是离散的,而频域依然是连续的。对DTFT频域离散采样之后的操作,称为离散傅里叶变换(DFT)。


如果还不懂的话,可以看这个: 一幅图弄清DFT与DTFT,DFS的关系。

一幅图弄清DFT与DTFT,DFS的关系 - BitArt - 博客园www.cnblogs.com

java傅里叶变换包 maple傅里叶变换_java傅里叶变换包_06


4. 快速傅里叶变换

在离散傅里叶变换(DFT)上,当N很大时,直接计算的方法,耗时太久。因此,有研究者提出了很多快速傅里叶变换(FFT)的算法。

matlab实现快速傅里叶变换

----
clear;clc
Fs = 1000; % 采样频率
T = 1/Fs; % 采样周期
L = 1000; % 信号长度 由此知,频率分辨率为 1hz
t = (0:L-1)*T; % 时间相量
S = 0.7*sin(2*pi*50*t+pi/4) + sin(2*pi*150*t-pi/2); % 原始函数
Y = fft(S);
P2 = abs(Y/L); % 每个量除以数列长度 L
P1 = P2(1:L/2+1); % 取交流部分
P1(2:end-1) = 2*P1(2:end-1); % 交流部分模值乘以2
f = Fs*(0:(L/2))/L; %横坐标频率
plot(f,P1)
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
----


得到结果如下:


java傅里叶变换包 maple傅里叶变换_matlab 离散傅里叶变换_07


特别要注意的有两点

1). fft之后的实数值部分,并不是真的amplitude,还需要 abs(z1)/L*2;

2). 横坐标,频率的计算;

5. 功率谱 (Power Spectral density, PSD)

根据Weiner-Khintchine 定理,信号的功率谱和其自相关函数服从一对傅里叶变换公式,


java傅里叶变换包 maple傅里叶变换_java傅里叶变换包_08


但是实际计算中,会遇到两个问题 (a)不可能获得无限长度的信号 (b)有噪音。

谱估计方法分为经典和现在方法。

参考文献

  1. https://en.wikipedia.org/wiki/Fourier_transform
  2. 数字信号处理 姚天任