# 傅立叶级数

函数有不同频率成份,可以看成是由不同频率成份的函数组合而成,而傅立叶分析主要就是用来观察和分析函数的各种不同频率成份。

一般周期性信号的频率成份,会有一个最低的频率成份称为基频,其他频率成份会是这个频率的倍数,也可以说是相关的谐波。这些频率成份的系数,可以使用傅立叶级数来计算。如果信号不是周期性的,但是有一个限制的区间,那我们也可以把这个区间重复延伸,看成是周期性的函数。

假设函数 s(x)s(x) 定义在 [x0,x0+P][x_0, x_0+P] 的区间,则其傅立叶级数为

a02+n=1(ancos(2πnxP)+bnsin(2πnxP)),\frac{a_0}{2} + \sum_{n=1}^{\infty} (a_n\cos(\frac{2\pi n x}{P}) + b_n\sin(\frac{2\pi n x}{P})),

其中

an=2Px0x0+Ps(x)cos(2πnxP)dxa_n = \frac{2}{P}\int_{x_0}^{x_0+P} s(x)\cos(\frac{2\pi n x}{P})\ dx
bn=2Px0x0+Ps(x)sin(2πnxP)dxb_n = \frac{2}{P}\int_{x_0}^{x_0+P} s(x)\sin(\frac{2\pi n x}{P})\ dx

ana_nbnb_nnn 阶谐波的系数。

接下来,我们要使用 MATLAB 来观察一个锯齿状的三角波,我们把它的傅立叶级数的係数算出来,然后把 NN 项谐波的成份加起来,和原来波形放在一起观察。 这边使用的波形 s(t)s(t) 函数如下:

可以算出其傅立叶级数为:
s(x)=2πn=1(1)n+1nsin(nx)s(x) = \frac{2}{\pi}\sum_{n=1}^{\infty}\frac{(-1)^{n+1}}{n}\sin(nx)

MATLAB 程式步骤如下:

  1. MATLAB 有一个 sawtooth 函数,可以直接画出锯齿波形。sawtooth 定义在 Signal Processing 工具箱,如果使用 MATLAB,必须确定此工具箱已正确安装;如果使用 Octave,则可以使用 signal 套件。关于 Octave 套件的安装方式,在 Windows 环境下,可参考 官网的说明 (opens new window),如果是在 Ubuntu 的话,直接使用以下指令进行安装:
sudo apt-get install octave-signal
1
  1. 在 Octave 裡面,先使用 pkg load signal 指令将 Signal Processing 套件载入。接着便可以使用 sawtooth 函数(可用 help sawtooth 查看此函数的使用说明)。试着使用以下指令画出 sawtooth 函数图形:
t = -8:0.1:8;
s = sawtooth(t-pi); % sawtooth 预设周期为 2*pi,在 0 的地方转折
plot(t,s);
grid on; % 画格线		
1
2
3
4

观察一下波形看是否正确。

  1. 画部分级数和。
N = 5;   % 项数
sgn = 1; % 用作正负变号使用,第一项为正
t = -8:0.1:8; 
fs = zeros(size(t)); % 设 fs 跟 t 维度一样,全为 0
for n = 1:N          % 从 1 跑到 N
	fs = fs + 2*sgn*sin(n*t)/(n*pi); % 加一项
	sgn = sgn * -1;  % 变号
end
plot(t,fs); % 画图
1
2
3
4
5
6
7
8
9

观察一下合成的波形。

  1. 最后将两个波形画在一起,程式码如下:
N = 5;
t = -8:0.1:8;
sgn = 1;
s = sawtooth(t-pi); % sawtooth 预设周期为 2 pi,在 0 的地方转折
fs = zeros(size(s));
for n = 1:N
    fs = fs + 2*sgn*sin(n*t)/(n*pi);
    sgn = sgn * -1;
end
plot(t,s,'b',t,fs,'r');
grid on; % 画格线
1
2
3
4
5
6
7
8
9
10
11

执行后的结果如下:

在上面的程式中,我们已经知道 s(t)s(t) 的傅立叶级数的 ana_nbnb_n 的系数,如果是其他函数的话,可能要花很多时间计算。实际上,MATLAB 有一个 Symbolic Math Toolbox,可以帮忙做符号运算。

如果是 Octave 的话,则裡面有一个 symbolic 套件可以使用。 可以在 Octave 的命令视窗中直接执行以下指令来安装 symbolic 套件:

pkg install -forge symbolic
1

接着用 pkg load symbolic 载入套件来使用。

例如 f(x)=x2f(x)=x^2,假设定义在 [π,π][-\pi,\pi] 的区间,可以使用以下方式计算 ana_n 的係数。

pkg load symbolic
syms x n;    % x, n 为符号
f = x^2;     % f(x) = x^2
an = int(f*cos(n*x), x, -pi, pi) / pi;    % 计算定积分的值
1
2
3
4

練習 3

MATLAB 裡面有一个 square 函数,可以用来画出方波函数 (用 help square 查询看看)。请利用 symbolic 套件来计算方波的傅立叶级数,接着用程式画出方波及其部分傅立叶级数和的图形,此处方波的周期和振幅可自己定义。