乔 有 田
(扬州职业大学, 江苏 扬州 225009)
“信号与系统”是电子信息类专业的一门专业基础课,该课程的特点是概念多且抽象和难以理解,书中涉及的数学知识和公式多,系统分析中的时域图和频域图难以绘制,学习过程比较枯燥,学生学习的积极性不高。针对“信号与系统”的课程特点和传统教学方法的局限性,对“信号与系统”课程与Python语言编程进行融合,将书中的理论通过计算机编程以图形、动画的形式展示,让学生在享受计算机编程乐趣的同时对书中的概念、知识和公式有比较直观的认识。
Python是一种面向对象的解释型、弱类型脚本语言,它也是一种功能强大而完善的通用型语言。Python具有脚本语言中最丰富和强大的类库,这些类库覆盖了文件 I/O、GUI、网络编程、数据库访问、文本操作等绝大部分应用场景。Python借助扩展模块可以轻松完成从字符串处理到复杂的3D图形编程等多种任务[1-2]。
“信号与系统”这门课程中有些概念比较抽象难懂,例如卷积、周期信号的傅里叶级数分解、信号频谱等,在教学实践中,将这些知识点用Python语言编写出相关的程序,使用图像、文字、和动态画面有机融合的方式,帮助学生加深对知识点的理解。
所谓创新型实验,就是鼓励学生对书后的一些综合性的题目,用Python语言来进行解答,利用Python语言强大的数值计算能力和丰富的图形功能展示计算的过程和结果,使学生在享受编程所带来的成功喜悦的同时,加深对理论的理解。
为了加强对学生工程思维和工程能力的培养,教学实验中引入既与理论知识相关又具有专业背景的工程实例。如在讲解滤波器的时候,通过Python设计不同类型的滤波器对由两个频率的正弦信号构成的合成信号进行滤波,并观察滤波效果,让学生切实地体会不同的滤波器对信号的影响;同时也可以使学生明白在以后的工作中应如何应用“信号与系统”课程的知识点。学生参与到实践操作活动中,可以使其动手操作能力和解决实际问题的能力得到有效的训练。
本文对系统的时域响应、信号卷积运算、信号傅里叶级数、信号滤波器、系统函数应用等进行仿真设计[3-5]。
对于线性时不变系统,线性连续时间系统的数学模型用常系数微分方程来描述,线性离散时间系统的数学模型用常系数差分方程来描述。如果系统的输入信号及初始状态已知,通过数学方法便可以求出系统的零输入响应、零状态响应、冲激响应和阶跃响应。由于运用数学工具进行求解,得出的结果仍为数学表达式,学生很难直观地认识系统的激励和响应之间的关联。在本虚拟实验系统中,可以对激励和响应进行仿真,从而实现对其实时性、直观性和逼真性的认识和理解。下面用一个例子说明。
例1:已知描述某连续系统的方程为:
7y″(t)+4y′(t)+6y(t)=f′(t)+f(t)
试用Python画出冲激响应和阶跃响应的波形。
Python针对线性时不变系统的冲激响应和阶跃响应提供了scipy.signal.step2(阶跃响应)和scipy.signal.impulse2(冲激响应)函数。参考程序如下:
sys=scipy.signal.lti([1, 1], [7, 4, 6]) #构造系统
st, sy=scipy.signal.step2(sys)#求系统的阶跃响应
it, iy=scipy.signal.impulse2(sys)#求系统的冲激响应
所得波形如图1所示。
图1 冲激响应和阶跃响应波形
卷积计算在“信号与系统”理论中占有重要地位,是“信号与系统”课程中重要且抽象的内容,作为一种全新的运算,它包含变量替换、反褶、移位、乘积、积分等步骤,比较复杂和抽象,为了使学生更好地理解其求解过程,通过Python编写程序,设计两个矩形波相卷积的动画,动态展示卷积的计算过程。
Python中使用scipy.signal.convolve计算卷积,并利用matplotlib.animation.FuncAnimation模块制作卷积的动画,本文截取3个时刻的过程图,如图2所示。
图2 信号卷积的波形
图2从上到下分别显示了其中一个被卷积函数波形、另一个被卷积函数反褶后不断向右平移的波形、一个函数与另一个反褶平移后的函数乘积,最终得到积分的结果。动态图很好地展示了卷积的运算过程。
傅里叶变换是信号处理领域非常重要的一种变换,是整个信号处理课程的核心,由于学生首次从时域和频域两个角度来认识信号,认知上有难度。用Python软件设计的方波合成动画程序,学生可以自己调整,改变参数,得到合成的效果图,帮助学生更好地理解周期信号的傅里叶级数分解。一个周期信号,可以分解成傅里叶级数的形式,理论上包含无穷多个谐波分量,可以用Python来演示谐波合成的情况。
例2:一个周期为T的方波,其傅里叶级数可以表示为:
通过编程演示方波分解为正弦波的情况。
实例中用同一个窗口依次展示基波、叠加2次谐波和叠加8次谐波。为了方便对比,将各图分别画在不同的窗口中,如图3所示。图3很好地展示了方波的合成情况,叠加谐波次数越多,合成波形越接近方波信号,很好地验证了周期信号的傅里叶级数表示。另外从图3(c)的前8次谐波合成图可以看出,当用周期方波的前8次谐波进行叠加时,所得到的合成波形已接近周期方波的轮廓。
图3 各次谐波合成
滤波器是“信号与系统”课程中的重要概念。滤波器按所通过信号的频段分为低通、高通、带通和带阻四种。滤波器广泛应用于通信、电力、语音处理、电视雷达等场合,通过Python可以编程实现四种滤波器的滤波功能。
Python设计滤波器时,使用scipy.signal.filtfilt和scipy.signal.butter两个函数,得到的效果如图4、图5所示。
图4 低通滤波器滤波效果
图5 高通滤波器滤波效果
通过两个频率分别为400 Hz和800 Hz的正弦波合成图形,分别用低通和高通两个滤波器进行滤波,分别得到低频和高频的正弦波。学生通过这个实验非常直观地看到滤波器的作用效果,同时在这个实验基础上,还可进行拓展,设计验证带阻和带通滤波器的程序。
系统函数是系统的数学模型之一,是由系统的本质特性确定的,与输入量无关。通过系统函数可以得出系统的重要属性,如系统功能、稳定性、因果性等。可通过系统的频率响应曲线大致推断系统的功能,通过系统的冲激响应或零极点推断系统的稳定性等。通过类似的创新型实验,学生可以将以前学过的孤立的知识点连贯成一个有意义的整体,使前后知识贯通。
例3:已知系统函数:
试判定系统是何种类型的滤波器,并判定系统的稳定性。
如前所述,系统的功能可以通过系统的频率响应曲线来得到,系统的稳定性可以通过系统的冲激响应和零极点来断定。这里用到Python的函数是control.pzmap、control.impulse-response和control.freqresp,得到的效果如图6、图7所示。
图6 系统的幅频特征
图7 系统的零极点分布和冲激响应
从图6(a)可以看出该系统函数表征的系统是一个低通滤波器。从图7(a)、(b)可以推断该系统是一个稳定的系统。可以看出,该方程不涉及复杂的数学运算,就可以得到期望的结果,这一方面降低了学习的难度,提高了学生的学习积极性;另一方面也使学生对系统功能的理解和稳定性的判断有一个直观、清晰的理解。
随着计算机信息技术的发展,虚拟仿真技术在高职教育中的应用变得越来越重要。本文以“信号与系统”课程为例,应用Python高级程序设计语言,对“信号与系统”课程的理论、数学公式的推导进行精心的设计和编程,并通过其强大的图形渲染功能使学生获得相关概念直观的感性认识,增加了学生的学习兴趣,实践证明取得了较好的教学效果。