📄 fsaxz.m
字号:
%FSAXZ Fourier Series Expansion demo.
% Demo initialization ====================
if ~exist('SlideShowGUIFlag'), figNumber=0; end;
t = 0:.1:10; y = sin(t); s=(y>0)*0.91;
if cssinit(figNumber),
plot(t,s), xlabel('时间(秒)')
ylabel('方波波形'), axis([0 10 0 1]), grid
str = str2mat( ...
' ', ...
' =======================================================', ...
' 这是一个有关傅立叶级数的演示', ...
' =======================================================', ...
' 图示方波是一个奇谐信号,由傅里叶级数可知,它是由无穷个', ...
' 奇次谐波分量合成的,现在我们用图形的方式来表示它的合成。', ...
' 我们只考察从 t=0 到 t=10s 这段时间内的信号。', ...
' ', ...
' 请按下“开始”按钮。' ...
);
cssdisp(figNumber,str);
if figNumber, return; end
end
% Beginning of the demo ==================
plot(t,y), xlabel('时间(秒)'), ylabel('波形'), grid
str = str2mat( ...
' ', ...
' 让我们先画出基波分量。', ...
' ', ...
' y(t)=sin(t)' ...
);
cssdisp(figNumber,str);
if csspause(figNumber), return; end;
y = sin(t) + sin(3*t)/3;
plot(t,y), xlabel('时间(秒)'), ylabel('波形'), grid
str = str2mat( ...
' ', ...
' 现在,将三次谐波加到基波之上,并画出结果,如图所示。', ...
' ', ...
' y(t) = sin(t) + sin(3*t)/3' ...
);
cssdisp(figNumber,str);
if csspause(figNumber), return; end;
y = sin(t) + sin(3*t)/3 + sin(5*t)/5 + sin(7*t)/7 + sin(9*t)/9;
plot(t,y), xlabel('时间(秒)'), ylabel('波形'), grid
str = str2mat( ...
' ', ...
' 再将一次、三次、五次、七次和九次谐波加在一起。', ...
' ', ...
' y = sin(t) + sin(3*t)/3 + sin(5*t)/5 + ',...
' sin(7*t)/7 + sin(9*t)/9' ...
);
cssdisp(figNumber,str);
if csspause(figNumber), return; end;
t = 0:.05:10; y=0;
for k=1:2:19
y = y + sin(k*t)/k;
end
plot(t,y), xlabel('时间(秒)'), ylabel('波形')
grid
str = str2mat ( ...
' ', ...
' 最后,我们合并从基波到十九次谐波的各奇次谐波分量。', ...
' ', ...
' 10', ...
' Y = ∑ sin((2k-1)*t))/(2k-1)', ...
' k=1' ...
);
cssdisp(figNumber,str);
if csspause(figNumber), return; end;
t = 0:.02:3.14;
y = zeros(10,max(size(t))); x = zeros(size(t));
for k=1:2:19
x = x + sin(k*t)/k;
y((k+1)/2,:) = x;
end
plot(t,y(1:2:9,:)'), title('方波的组成: 吉布斯现象')
xlabel('时间(秒)'), ylabel('波形');
set(gca,'XLim',[0 3.142])
grid
str = str2mat( ...
' ',...
' 将上述波形分别画在一幅图中,可以看出它们逼近方波的过程。', ...
' ',...
' 注意“吉布斯现象”。周期信号傅里叶级数在信号的连续点收', ...
' 于该信号,在不连续点收敛于信号左右极限的平均值。如果我们用', ...
' 周期信号傅里叶级数的部分和来近似周期信号,在不连续点附近将', ...
' 会出现起伏和超量。在实际中,如果应用这种近似,就应该选择足', ...
' 够大的 N,以保证这些起伏拥有的能量可以忽略。' ...
);
cssdisp(figNumber,str);
if csspause(figNumber), return; end;
global FSH HC;
hh = gca;
ha = axes('pos',[0 0 1 1],'Visible','off');
axis([0 1 0 1]), Nmax = 25;
tx(1) = text(.04,.7,'2','hor','right');
tx(2) = text(.04,.95,int2str(Nmax),'hor','right');
tx(3) = text(.04,.85,'项','horizontalalignment','right');
tx(4) = text(.04,.80,'数','horizontalalignment','right');
set(tx,'visible','off')
fig = gcf;
callbackStr = ['t=0:.02:3.14;x=zeros(size(t));' ...
'global HC FSH;' ...
'N = ceil(get(HC,''Value''));' ...
'y = zeros(N,length(t));' ...
'for k=1:2:(2*N-1);' ...
'x = x+sin(k*t)/k; y((k+1)/2,:) = x;end,' ...
'xd = 1:length(t); yd = (1:size(y,1))'';' ...
'set(FSH,''xd'',xd,''yd'',yd,''zd'',y,''CData'',y),' ...
'title([int2str(N) '' 项'']);'];
HC = uicontrol(fig,'Style','slider', ...
'Min',2,'Max',Nmax,'Units','normalized', ...
'Position',[0.05 0.70 0.03 0.25], ...
'Value',9,'CallBack',callbackStr,'visible','off');
set(fig,'currentaxes',hh);
surf(y); axis ij
FSH = get(hh,'Children');
P = pink(64);
colormap(flipud(P(17:64,:)));
ylabel('级数项数'), xlabel('波形')
title([int2str((k-1)/2) ' 项'])
set(HC,'visible','on');
set(tx,'visible','on');
set(fig,'CurrentAxes',hh);
str = str2mat( ...
' ', ...
' 现在,将这种情况用一个三维图形表示出来。为观察级数逼近', ...
' 方波的过程,你可以通过移动滚动条来改变部分和的数目。', ...
' ', ...
' 上图表明了一个方波信号的傅立叶级数是如何收敛的。' ...
);
cssdisp(figNumber,str);
if csspause(figNumber)
set(HC,'visible','off');
set(tx,'visible','off'); return
end
set(HC,'visible','off');
set(tx,'visible','off');
str = str2mat( ...
' ', ...
' 单击 “重置” 重新开始 '...
);
cssdisp(figNumber,str);
% End of the demo ========================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -