将PWM信号还原为原始信号

numpy_pwm.py

本习题的程序文件

PWM是Pulse Width Modulation的缩写,翻译成中文为脉冲宽度调制,简称脉宽调制。PWM是将模拟信号转换为脉冲波的一种技术,脉冲波的频率固定,其占空比随着模拟信号的大小而改变。

【图:演示脉宽调制】是用脉宽调制表示正弦波信号的例子。图中蓝色的曲线所表示的是模拟的正弦信号,它的值是连续变化的。绿色的点表示以一定周期对模拟信号进行取样所得到的数值。而红色脉冲波形则是将数字转换为脉冲宽度之后的脉宽调制波形。

例如在0时刻的取样值为0,因此0时刻到下一个取样时刻之间的调制信号全部为0,而第二个取样值约为0.3,因此从这个时刻开始有宽度为取样周期的30%的脉冲信号。

/tech/static/books/scipyex/_images//numpy_pwm_01.png

演示脉宽调制

你能编写出绘制【图:演示脉宽调制】的程序吗?

读入波形并积分

如果想将PWM信号还原为原始的取样信号,可以计算每个脉冲的宽度和脉冲周期的比例。但是这种方法较难实现而且精度不高。由PWM信号的定义可知,PWM信号的积分与原始取样信号的积分相同。因此我们可以先算出PWM信号的积分,然后再通过微分运算得到原始取样信号。

numpy_pwm.bin

取样频率为5MHz的二百万个单字节的PWM信号

“numpy_pwm.bin”中以二进制格式保存了取样频率为5MHz的二百万个单字节的PWM信号。请编写程序从其中读入PWM信号,并计算其积分信号:

import numpy as np
PERIOD = 2.00000e-07
FILENAME = "ex007_pwm.bin"
【你的程序】将FILENAME的内容读入数组pwm,并计算pwm的积分pwm_int

import pylab as pl
pl.figure(figsize=(8,5))
pl.subplot(211)
pl.plot(pwm)
pl.subplot(212)
pl.plot(pwm_int)

程序的输出如【图:PWM信号及其积分】所示,可以看出原始信号的积分是一个正弦波信号。

/tech/static/books/scipyex/_images//numpy_pwm_02.png

PWM信号及其积分

由于PWM信号的平均值不为零,因此积分之后的信号是倾斜的,可以使用scipy.signal.detrend()消除这种倾斜。或者在积分之前清除PWM信号的直流分量。

低通滤波并微分

如果对积分之后的信号直接微分,那么我们得到的仍然是PWM信号。如果你放大积分信号,可以看到它是由许多细小的阶梯构成。为了让它变成平滑曲线,可以对它进行低通滤波。低通滤波之后的积分信号是平滑的,再对其进行微分时,就可以得到原始信号了。请编写低通滤波与微分的程序:

from scipy import signal

【你的程序】对pwm_int进行低通滤波,并且计算其微分original

pl.figure(figsize=(8,4))
pl.plot(pwm*(np.max(original)/np.max(pwm)))
pl.plot(original, "r", lw=2)
pl.show()

【图:PWM信号和原始信号】为程序的输出。为了比较原始信号和PWM信号,图中将PWM信号的幅度修改为与原始信号一样大。

/tech/static/books/scipyex/_images//numpy_pwm_03.png

PWM信号和原始信号

图中的原始信号是采用两点微分公式计算而得,读者可以参考数值微分的精度,使用精度更高的微分公式计算。

內容目录

上一个主题

拟合正弦波的频率、相位和振幅

下一个主题

验证中心极限定理

本页

loading...