关于傅里叶变换的理解和应用一直没有理解透彻,知其然不知其所以然。于是在使用过程当中心里老是不踏实,总担心哪里会出错。所以抽空理解一下傅里叶级数的理论知识。
1,周期为2π的函数f(x)能够展开成三角级数的形式:,其中a0,a1,a2...,b0,b1,b2...叫做函数f(x)的傅里叶系数。其中
2,在长度为2π的区间上,三角函数系具有正交性,如下:
(n=1,2,3,...)
(n=1,2,3,...)
(m,n=1,2,3,...)
(m,n=1,2,3,...;m~=n)
(m,n=1,2,3,...;m~=n)
(n=1,2,3,...)
(n=1,2,3,...)
3,有了三角函数系的正交性质,第一步对函数f(x)两端求积分可知:
第二步对函数f(x)两边乘以coskx或sinkx后求取积分,可知
(k=1,2,3,...)
(k=1,2,3,...)
4,总结,公式真的很难打出来呀。令,则。所以傅里叶系数如下:
(k=0,1,2,...)
(k=0,1,2,...)
5,实战,根据上述的公式进行函数拟合。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
F0=5;
T0=1/F0;
w0=2*pi*F0;
Fs=48000;%模拟采样频率
cycle=9;
[fdata,x,fdata0,x0] =tri_gen(Fs,F0,cycle);
subplot(3,1,1);
plot(x,fdata,'color','r');
xlabel('时间/s');
ylabel('幅度');
N_x =length(x);%全时域采样点数目
N_x0=length(x0);%单周期采样点数目
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%依次求取直流分量和谐波分量
%数字域里面的积分相当于求和
Harmonic=3;%求9次谐波分量
a=zeros(Harmonic,1);
b=zeros(Harmonic,1);
for n=1:Harmonic
for m=1:N_x0
a(n)=a(n) + fdata0(m)*cos((n-1)*w0*x0(m));
b(n)=b(n) + fdata0(m)*sin((n-1)*w0*x0(m));
end
delta_x0 =T0/N_x0;
a(n) =a(n)*delta_x0;
b(n) =b(n)*delta_x0;
a(n) =2*a(n)/T0;
b(n) =2*b(n)/T0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%利用谐波数据拟合原始信号
fdout=zeros(1,N_x);
for m=1:N_x
for k=1:Harmonic
ak_coskx=a(k)*cos((k-1)*w0*x(m));
bk_sinkx=b(k)*sin((k-1)*w0*x(m));
if(k==1)
ak_coskx=ak_coskx/2;
bk_coskx=bk_sinkx/2;
end
fdout(m)=fdout(m) + ak_coskx + bk_sinkx;
end
end
subplot(3,1,2);
plot(x,fdout,'color','b');
xlabel('时间/s');
ylabel('幅度');
legend('2次谐波拟合');
subplot(3,1,3);
plot(x,fdata,'color','r');hold on;
plot(x,fdout,'color','b');
xlabel('时间/s');
ylabel('幅度');
legend('2次谐波拟合');
function [tri_out,x,tri_out0,x0] =tri_gen(Fs,F0,Num)
T0 =1/F0;
tick =1/Fs;%模拟采样间隔
x0=-T0/2:tick:T0/2-tick;%单周期时间值
tri_out0=x0.*x0;%单周期函数值
x=-T0/2*Num:tick:T0/2*Num-tick;
tri_out=repmat(tri_out0,1,Num);
end
依次画出2次谐波,4次谐波,32次谐波的曲线图,可以看到32次谐波拟合基本和原图像重合了。