(于长江)电路理论认为,任何非正弦周期波形都可以表示为一系列正弦波形的和,这就是谐波分析原理。如附图所示的方波可以由与它频率相同的基波和三次谐波,五次谐波等奇数次谐波叠加而成,所取的谐波次数越高,合成起来就越接近方波。非正弦周期波形谐波成份的幅度随着谐波次数的增高而递减,其递减的速度与原波形的形状有关。原波形越光滑,越接近正弦波形,则其谐波幅度递减越快;反之若原波形中含有尖角,甚至含有跳变,则其谐波幅度递减速度就很慢。通常说某个波形的谐波成份很丰富,就是指其谐波幅度递减得较慢。有时我们就是从一个多谐振荡器输出的方波中,用滤波器取出所需的某一频率的正弦波。也有时为了不失真地传输某一信号,就要相应地增加电路的通频带宽度,其原因也正是为了减少高次谐波的损失。可见,谐波分析是一个很重要的概念。文后所附程序,就是试图用屏幕形象帮助读者加深对这一概念的理解。

程序用QBASIC语言写成,需要VGA显示器的支持。另外请注意,如果您所用的汉字系统不支持QBASIC,则应把程序中的提示语改为英语或汉语拼音。
程序中第1至3行设置VGA显示方式、设定图形窗口坐标、文本行的位置以及相关参数。第4至7行在屏幕上显示提示语。第8至21行用来显示波形。其中第9行用来画横轴,第10行显示当前所取的最高谐波次数2n+1,第12行的y1是2n-1以下各次谐波的合成波形,第14行的y2是2n+1次谐波的波形,第13、15行中的两个PSET语句显示了这两个波形。第16行显示了2n+1以下各次谐波的合成波形(y0)。第17至20行用来显示相对应的方波波形。
第22至28行用做人机对话。第22行读键值,第24行监视“↑”键,发现按动则增加谐波次数,25行监视“↓”键,发现按动则减少谐波次数,第26行用来确定是否只显示y0波形,为此,这行程序检查是否接了“n”或“N”键。
如果我们想要了解方波以外其它波形的谐波分析和合成的情况,可以修改程序中的第12至14行。例如按下述逐行进行修改,即可表现三角波形的谐波分析与合成的情况。
12:ii%=-1:FORi%=1 TOn%: ii%=-1k*ii%”
13:y1=y1+ii%* S IN(2*(2*i%-1)*f*x)/(2*i%-1)/(2*i%-1):NEXT i%:IF bk THENPSET(x,y1),12
14:y2=-(-1)i%*SIN(2*(2*n%+1)*f*x)/(2*n%+ 1)/(2*n%-1)
17:IF bk THEN
18:LINE(0,0)-(pi/4,pi*pi/8),7,,&HFFFF:LINE-STEP(pi/2,-Pi* pi/4),7,,& HFFFF
19:LINE-STEP(pi/2,pi*pi/4),7,,&HFFFF:LINE-STEP(pi/2-pi* pi/4),7,,&HFFFF
20:LINE-STEP(pi/2,pi*pi/4,7,,&HFFF:LINE-STEP(pi/4,-pi* pi/8), 7,, & HFFFF
其中第17至20行用来显示三角波形本身。
附:程序清单
1:SCREEN12:WIEW(1,1)-(638,400),,12
2: CONST pi=3.14159:tw=2*pi:f= 1
3:WINDOW(0,-1.5)-(tw,1.5):VIEW PRINT 27 TO 29
4: PRINT″ CHR$(24)+″″+ CHR$(25)+”:加减谐波次数。
5:PRINT″<N>or<n>:背景开关。按其它键退出。″
6: PRINT″红波形+绿波形=黄波形。″
7:LOCATE 28,52:PRINT″最高谐波次数:″:bk=-1:n%=1
8: DO:CLS:FOR x=0 TO twSTEP tw/720
9:LINE(0,0)-(tw,0),7,&HFFFF
10:LOCATE 28,67:PRINT2*n%+ 1: y1=0
11: FOR i%= 1 TO n%
12:y1=y1+SIN(2*(2*i%-1)*f*x)/(2*i%-1)
13:NEXT i%:IF bk THEN PSET(x,y1),12
14:y2=SIN(2*(2*n%+1)*f*x)/(2*n%+1)
15: IF bk THEN PSET(x,y2), 10
16: y0=y1+y2: PSET(x,y0),14
17:IF bk THEN IF y0>0 THEN yy=pi/4 ELSE yy=-pi/4
18: PSET(x,yy),7
19:IF ABS(y0) <.01 THEN
20:LINE(x,-pi/4)-(x,pi/4),7,,&HFF
21:END IF:NEXT x
22:DO: ink $=INKEY $:LOOP UNTIL ink $<>″″
23:SELECT CASE ink$
24:CASE CHR$(0)+CHR$(72):n%=n%+1
25:CASE CHR $(0)+CHR $(80):IF >n%>1THEN n%=n%-1
26:CASE CHR$(78),CHR$(110):bk=NOT bk
27:CASE ELSE:END
28:END SELECT:LOOP:END