对于级数的概念,可以参考《泰勒级数及其应用》。在《高等数学》中,我们学习了傅立叶级数。傅立叶级数要求函数是周期的。对于非周期的函数,《复变函数与积分变换》中提出了傅立叶变换,使得傅立叶定理的适用范围更加大。前面的傅立叶级数和傅立叶变换都是针对连续函数,对于离散的情况,《数字图像处理与分析》中提出了离散傅立叶变换,使得傅立叶变换在图像处理中的得到广泛的应用。
傅立叶级数:法国数学家傅里叶发现,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示(选择正弦函数与余弦函数作为基函数是因为它们是正交的),后世称为傅里叶级数(法文:série de Fourier,或译为傅里叶级数)一种特殊的三角级数。
三角级数是任何具有下述形式的级数:
当和
具有以下形式时,该级数称为傅立叶级数:
或者
-------------(3)
其中是可积函数,式(2)和式(3)不同的地方在其积分区间的始末位置,但是其积分区间长度都是一个周期。
傅立叶级数的存在性:一个定义在上周期为
的函数
,如果它在一个周期上可积,则一定能作出
的傅立叶级数。但是
的傅立叶级数不一定收敛,更不一定收敛于
!那么,傅立叶级数在什么条件下收敛呢?
傅立叶级数收敛定理(Dirichlet定理):设是周期为
的周期函数,如果它满足
(1)在一个周期内连续,或者只有有限个第一类间断点,
(2)在一个周期内至多只有有限个极值点,
则的傅立叶级数在整个数轴
上处处收敛,并且
(1)当x是的连续点时,级数收敛于
;
上面讨论的函数的周期是
的,当周期不是
而是
,那将会怎么样呢?
在《高等数学》中指出,只要作变量代换或者
,就可以使得周期为
的
变为周期为
的函数
。可以将
展开为傅立叶级数,其系数为:
其实,在《复变函数与积分变换》中,指出了更为一般的形式:
其中
----------------------------(6)
傅立叶级数复指数形式:在前面的讨论中,使用的都是三角函数的形式。在《复变函数与积分变换》中,给出了傅立叶级数的另外一种形式——复指数形式。通过复指数形式,可以将傅立叶级数推导至傅立叶变换。
欧拉公式如下所示:
------------(7)
根据公式(7),可得:
将式(8)代入式(5)得:
令
得
其中,根据式(10)可以得:
傅立叶级数工程应用:
在工程应用中,通常使用时间来作自变量,因此将式(5)的
改为
,得:
为了使得物理意义更加明显,令
则式(13)改变为
同理,将式(12))的改为
,得:
傅立叶级数物理意义:
式(16)说明,周期信号可以分解为简谐波之和,这些简谐波的角频率分别为一个基频
的
倍。
反映了角频率为
的谐波在
中所占的份额,称为振幅;
反映了角频率为
的谐波沿时间轴移动的大小,称为相位。
在《电路》的非正弦周期电流、电压、信号等的分析中,常常将其展开为傅立叶级数,也就是进行谐波分析。在《电路》中,将式(16)第一项称为恒定分量,或者直流分量;第二项
称为1次谐波,或者基波分量,其周期或频率与原周期函数
相同;其它各项统称为高次谐波。
在《电路》中还指出,以为横坐标,
为纵坐标作图
,即是
的幅度频谱图。同理,以
为横坐标,
为纵坐标,作图
,即是相位频谱图。
另外需要注意的是,时间通常不会有负数,实际中式(6)中的积分区间为
。但是,在数学计算中,可以将其区间用
来代替,这样计算更方便。如式(20)。其实,在《电路》一书中,就是这么做的!这样就将工程实际和抽象数学统一了。
对于复指数形式,
因此的模与幅角反映了信号
中频率为
的简谐波的振幅和相位,其中振幅
被平均分配到正负频率上。负频率的出现则完全为了数学表示方便,它与正频率一起构成同一个简谐波。
因此被称为
的离散频谱。
为离散幅度频谱,
为离散相位频谱。这和式(16)的物理意义是统一的。但是这里的
大小是
的一半!
实例分析1
设是周期为
的周期函数,它在
上的表达式如式(20)所示,将其展开成傅立叶级数。
-----------------------------(20)
解:
由于在
上只有一个第一类间断点,并且没有极值点,所以满足Direchlet条件。
根据式(2)得
从而,的傅立叶级数展开式为
复指数形式为
Matlab编程1:由于Matlab中没有专门的傅立叶级数函数,因此需要自己编程实现,如下所示。
%求的函数
function an=fourieran(f,T,n)
syms x
w=2*pi/T;
an=2*int(f*cos(n*x),x,-T/2,T/2)/T;
%求的函数
function bn=fourierbn(f,T,n)
syms x
w=2*pi/T;
bn=2*int(f*sin(n*w*x),x,-T/2,T/2)/T;
%求式(6)傅立叶级数展开的前15项
clear
clc
syms x n
f=x/abs(x); %式(13)的一种委婉表达
T=2*pi;
a0=fourieran(f,2*pi, 0); %先求a0,再求a1~a15
for n=1:15
a(n)=fourieran(f,T, n);
end
for n=1:15 %求b1~b15
b(n)=fourierbn(f,T, n);
end
求得结果:
a0=0
a=[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
b=[ 4/pi, 0, 4/(3*pi), 0, 4/(5*pi), 0, 4/(7*pi), 0, 4/(9*pi), 0, 4/(11*pi), 0, 4/(13*pi), 0, 4/(15*pi)]
结果分析:对比Matlab程序的运行结果和式(25),发现两者系数是一致的。这说明Matlab编程正确。
说明:本程序适合周期为的函数,而不仅仅适合周期为
的函数!
实例分析2
将实例分析1的函数的自变量用
替换,则
就是《电路》中的方波信号。如下图所示:
图1 方波函数
在实例分析1中,已经计算出了、
的值,在此基础上,根据式(18)就可以计算出
,而
。将Matlab编程1的第3个文件的代码修改补充为如下:
Matlab编程2
clear
clc
syms x n
% f=x^2+x^3
f=x/abs(x);
T=2*pi;
w0=2*pi/T;
t=[-5:0.01:5];
a0=fourieran(f,2*pi, 0);
for n=1:15
a(n)=fourieran(f,T, n);
end
for n=1:15
b(n)=fourierbn(f,T, n);
end
%计算相位
for n=1:15
g(n)=-atan(b(n)/a(n)); %由于b(n)/a(n)<0,因此g取负值,在前面加“-”。
end
%计算振幅
for n=1:15
A(n)=sqrt(a(n)*a(n)+b(n)*b(n));
end
figure(1)
f=A(1)*cos(1*w0*t+g(1))*0;
for n=1:2:15
fn=A(n)*cos(n*w0*t+g(n));
f=f+fn;
plot(t,fn);
hold on;
end
plot(t,f,'r');
% t=[-5:0.01:5];
hold on
plot(t,square(t));
plot(t,0,'k');
hold on
plot(0,t,'k');
set(gcf,'color','w');
xlabel('t')
ylabel('f(t)')
title('15次谐波合成曲线')
figure(2)
subplot(1,2,1);
bar(double(A))
title('幅度频谱')
ylabel('An');
xlabel('nw0');
subplot(1,2,2);
bar(double(g))
title('相位频谱')
ylabel('g');
xlabel('nw0');
set(gcf,'color','w');
运行程序,得到图2、图3的结果:
图2 5次谐波合成曲线
图3 15次谐波合成曲线
图4 矩形波频谱
在前面,我们讨论了周期函数的傅立叶级数,那么非周期函数应该怎样展开呢?
对于非周期函数,虽不能进行傅立叶级数展开,但是可以进行傅立叶变换!
为了表示周期函数与非周期函数的区别,用表示周期函数
表示非周期函数,并且用
替换
,则式(11)和式(12)重写为如下形式
--------------------------(27)
将非周期函数看作是由周期函数
当
时转化来的,由式(27)得
令,则式(28)可改为
这是一个和式的极限,按照积分的定义,在一定条件下,式(29)可写为
注意:用
代替了!
傅立叶积分定理:如果在
上的任一有限区间满足Dirichlet条件,且在
上绝对可积,即
,则式(30)成立。式(30)被称为傅立叶积分公式。
令式(30)中间的积分为
将式(31)代入式(30),得
式(31)和式(32)就是传说中的傅立叶变换和傅立叶反变换!
傅立叶变换物理意义:
对比式(32)和式(27),由于是离散频谱,因此
是连续频谱。
是幅度频谱,
是相位频谱。在《复变函数与积分变换》一书中还提到
也称为频谱密度函数。至于这个密度函数和《概率论》中的密度函数是否为同一概念,还有待追究。
说明:由于式(32)和式(27)都是复数形式,因此其物理意义不明显,但是他们都是直接或者间接的源于式(16),因此具体的物理意义还要看回式(16)。通常我们需要求的是式(31),但它是一个复数结果,如果不明白它的物理意义,那么就不知如何对得到的结果进行合理的分析。
在《数字图像处理与分析》一书中,还提出了如下的傅立叶变换与反变换形式:
---------------------------(33)
此外,还将一维函数的傅立叶变换推广到了二维函数
,如果
满足Dirichlet条件,则它的傅立叶变换与反变换为
实例分析3
解:
--------------------------(35)
振幅频谱为
---------------------------------------(36)
相位频谱为
Matlab编程3
Matlab中没有直接傅立叶变换函数,因此需要自己编程实现。(注意:Matlab中自带了离散傅立叶变换的函数)
clear
clc
syms x t d
f=0.5*((x+1)/abs(x+1)-(x-1)/abs(x-1)); %题目中的模拟
F=exp(-i*x*t);%式(33)中第一行最右边一个积分中的积分函数
Fw=int(F,t,-1,1); %积分,这里设定积分区间为[-1,1]
figure(1)
ezplot(f) % 画原函数图
axis([-5 5 0, 2]);
ylabel('f(t)');
xlabel('t');
set(gcf,'color','w');
% figure(2)
ezplot(abs(Fw),-10,10) %画幅度频谱图
ylabel('|F(w)|');
xlabel('w');
grid on
set(gcf,'color','w');
运行结果:
图5 原函数图
图6 幅度频谱图
结果分析:对比图6和图4,可以发现图4是离散的,图6是连续的,傅立叶级数和傅立叶变换频谱的最大区别,其它的都一样。
上面讨论了连续的傅立叶变换,接下来就到了离散的傅立叶变换了!
在图像处理中,很少使用时间作为自变量,而更多使用的是
、
;同时频率也不再使用
,而更多使用的是
、
。其实这和《高等数学》的习惯是一致的。将式(33)重写为如下形式:
根据式(38),可以将连续的傅立叶变换转化为离散的傅立叶变换(DFT):
或者
或者
----------------------------(41)
说明:
(1)是
的采样点个数;
同理,对于根据式(34)可得二维的离散傅立叶变换和反变换为:
--------------------------(42)
或者
----------------------------(43)
或者
说明:
(1)是
的
方向的采样个数,
是
的
方向的采样点个数;
在《MATLAB数字图像处理》一书中,还给出了另外一种形式:
-----------------------------(45)
二维离散傅立叶变换物理意义:
式(42)、式(43)、式(44)以及式(45)中的、
为频域变量单位为弧度/采样单元。其中,式(42)、式(43)、式(44)中
,
。二维离散傅立叶反变换说明
可以表示为无限多项不同频率的复指数之和,而不同频率点
所占的比例有幅度
决定!
Matlab编程4
对于离散傅立叶变换,Matlab已经自带了函数fft、fft2。这里为了加深对离散傅立叶变换的理解,依据式(44)编写离散傅立叶变换程序如下。
clear
clc
I=imread('pic.jpg'); %二维离散傅立叶变换通常使用在图像分析中,因此这里使用图像来作为实例
imshow(I);
I=rgb2gray(I); %在进行二维离散傅立叶变换前,必须先进行灰度化
I=double(I);
[M,N]=size(I);
for u=1:M %以下就是根据式(44)进行编程。为什么是式(44)而不是式(42)呢?因为经过对比发现,式(44)的计算结果和fft2一致!
for v=1:N
temp=0; %一个临时变量,用于累加
for x=1:M
for y=1:N
temp=temp+I(x,y)*exp(-i*2*pi*((u-1)*(x-1)/M+(v-1)*(y-1)/N));
end
end
myfft(u,v)=temp;
end
end
结果分析:
经过测试,发现上述程序的结果和使用fft2函数得到的结果是一样的。但是,上面程序运行速度非常的慢,运行了30多分钟,还没有计算完毕!而使用fft2,计算过程是瞬间的事情。fft,就是快速傅立叶变换。
参考资料
《高等数学》_广东科技出版社
《复变函数与积分变换》_第三版_华中科技大学数学系_高等教育出版社
《数字图像处理与分析》_北京航空航天大学出版社
《电路》_第5版_高等教育出版社
《概率论》_第二版_中国农业出版社
《MATLAB数字图像处理》_第2版_机械工业出版社
三角级数_维基百科
傅立叶级数_百度百科
傅立叶变换_百度百科
离散傅里叶变换_百度百科
MATLAB积分方法
傅立叶变换的物理意义
图像傅立叶变换(二维傅立叶变换fourier, 二维DFT, 2d-fft)的原理和物理意义
快速傅里叶变换FFT的Matlab实现
实现快速傅立叶变换的程序