# Python 在信号处理中的优势

## 前言

Scilab，Octave，Sage...所有都有点脆弱，并且似乎没有我想要的功能特点和丰富性。之后我发现了 Pylab 。

Pylab 是 Python 环境的科学计算，包含了以下的包：

1. matplotlib：图形和数据可视化；
2. numpy：基本的数值分析（向量，矩阵，针对这些运算的科学函数）；
3. scipy：科学和工程应用。

1. 你具有命令行的操作系统
2. 你可以运行 Python
3. 有编译器运行在你的操作系统中，所以你不必需要交叉-编译

## 应用例子

### 中心对齐PWM（脉冲宽度调制）

```import matplotlib.pyplot as plt
import numpy
import scipy.integrate

t = numpy.arange(0,4,0.001)

# duty cycle on phase A and B
Da = 0.70
Db = 0.40

def extendrange(ra,rb):
if ra is None:
return rb
elif rb is None:
return ra
else:
return (min(ra[0],rb[0]),max(ra[1],rb[1]))

def createLimits(margin, *args):
r = None
for x in args:
r = extendrange(r, (numpy.min(x),numpy.max(x)))
rmargin = (r[1]-r[0])*margin/2.0
return (r[0]-rmargin,r[1]+rmargin)

def showripple(centeralign=False):
# voltage waveforms on phases A and B

if centeralign:
sawtooth = abs(2*(t % 1) - 1)
Va = sawtooth < Da
Vb = sawtooth < Db
else:
ramp = t % 1
Va = ramp < Da
Vb = ramp < Db

Vab = Va - Vb

def ripple(x,t):
T = t[-1]-t[0]
meanval = numpy.mean(x)
# cumtrapz produces a vector of length N-1
# so we need to add one element back in
return numpy.append([0],scipy.integrate.cumtrapz(x - meanval,t))

Iab = ripple(Vab, t)

# plot results
margin = 0.1
fig = plt.figure(figsize=(8, 6), dpi=80)
y = [Va*0.8, Vb*0.8+1]
ax.plot(t,y[0],t,y[1])
ax.set_yticks([0.4,1.4])
ax.set_yticklabels(['A','B'])
ax.set_ylim(createLimits(margin,y[0],y[1]))
ax.set_ylabel('Phase duty cycles')

ax.plot(t,Vab)
ax.set_ylim(createLimits(margin,Vab))

ax.plot(t,Iab)
ax.set_ylim(createLimits(margin,Iab))
ax.set_ylabel('Ripple current')
savefile = 'pwm-%s-1.png' % ('center' if centeralign else 'edge')
fig.savefig(savefile, dpi=fig.dpi)

showripple(centeralign=False)
showripple(centeralign=True)
plt.show()```

```import matplotlib.pyplot as plt
import numpy
import itertools

# array version of the zip() function
def azip(*args):
iters = [iter(arg) for arg in args]
for i in itertools.count():
yield tuple([it.next() for it in iters])

# special case for 2 args
def azip2(a1,a2):
it1 = iter(a1)
it2 = iter(a2)
for i in itertools.count():
yield (it1.next(), it2.next())

def rcfilt(t,Vin,R,C):
N = len(C)
Vc = [0]*N
tprev = None
for (tj,Vj) in azip2(t,Vin):
if tprev is not None:
I = [(Vj-Vc[0])/R[0]] + [(Vc[k-1]-Vc[k])/R[k] for k in range(1,N)] + [0]
dt = tj - tprev
for k in range(N):
Vc[k] += (I[k]-I[k+1])/C[k]*dt
tprev = tj
yield numpy.array(Vc)

# 0-100 microseconds
t = numpy.arange(0,100,0.1)*1e-6
tus = t*1e6
Vin = (tus >= 10) * 1.0

# R1 = 1kohm,  C1 = 10nF
# R2 = 10kohm, C2 = 1nF
R = [1000, 10000]
C = [10e-9, 1e-9]
Vc_a = numpy.array(list(rcfilt(t,Vin,R,C)))

R = [1000, 1000]
C = [10e-9, 10e-9]
Vc_b = numpy.array(list(rcfilt(t,Vin,R,C)))

fig = plt.figure(figsize=[8,6], dpi=80)
ylabels = ['Vc_a', 'Vc_b']
for (k,Vc) in enumerate([Vc_a,Vc_b]):
ax.plot(tus,Vin,tus,Vc)
ax.legend(['Vin','Vc1','Vc2'])
ax.set_ylabel(ylabels[k])
ax.grid('on')

ax.plot(tus,Vc_a[:,-1],tus,Vc_b[:,-1])
ax.legend(['Vc2_a','Vc2_b'])
ax.set_ylabel('Vc2')
ax.grid('on')

fig.suptitle('2-pole RC filters: Vc_a = 1K,10nF,10K,1nF; Vc_b = 1K,10nF,1K,10nF')
fig.savefig('rcfilt1.png',dpi=fig.dpi)
plt.show()  ```

```from sympy import *
x0,x1,y0,y1,m,h = symbols('x0 x1 y0 y1 m h')
simplify(integrate((m*(x-x0)+y0)**2,(x,x0,x0+h)).subs(m,(y1-y0)/h))```

## 安装

Python 核心的安装是非常简单的；OSX 系统用户可以直接安装 Python，但是不管你是什么操作系统，在 Python 官网 python.org 有编译好的二进制安装文件。

scipy.org 网站上列出了一些很好的解决方案;我原以为我也会分享自己的经验。大师我没有使用 Linux 所以请查看 scipy.org 页面的解决方案。

## WINDOWS系统

1. Enthought Canopy
2. PortablePython
3. PythonXY

PortablePython 具有最可靠的安装/运行时。

PythonXY 具有最大的功能集（以及最大的安装占用空间）。

Enthought Canopy 不错;。Enthought 提供免费的版本试用，如果你想要更多的库，可以购买非免费版本 - 比如他们早期的发行版，EPD。这些版本从命令行运行起来有点容易，但我不知道如何稳定地跑起来。

## MAC OSX系统

PyLab 最简单的免费安装似乎是来自 Continuum Analytics 的 Anaconda。安装很简单，很快就能工作...除了我运行为这篇文章编写的脚本（脚本确实正常工作）时有一些关于内存分配的警告。当我去运行我常规的 Python 安装时，我的matplotlib 安装搞砸了。哎呀，希望这些问题能得到理顺。Anaconda 貌似很有前景。

Mac 上常用的免费软件进程是使用像 fink 或 MacPorts 这样的包管理器。 MacPorts 进程（sudo port install blahblahblah ...来自命令终端）有点脆弱。如果你的设置有问题，那么整个过程就会停止，并且带有一个神秘的信息。

Enthought Canopy 也有 OSX 和 Linux 版本，但我还没有试过。

1. Python
2. matplotlib
3. scipy
4. numpy

0 条评论

• ### 微分方程和差分方程的区别与联系

微分方程和差分方程的知识我们应该都知道，因为在数字信号处理中微分方程涉及了模拟滤波器，差分方程涉及了数字滤波器。但是有时会搞不清楚，或者说会在概念上混淆。虽然在...

• ### [翻译] Python 在信号处理中的优势之二

还有，诸如SPTool（用于一般信号可视化和过滤）或FDATool（用于数字滤波器设计）的GUI工具用于高质量的专业级信号处理和控制系统设计。

• ### 地震信号的一些基本概念

可控震源是指通过一个与大地紧密耦合的振动平板，以反作用方式向地下传送一组连续振动的弹性波信号(又称扫描信号)，再经过对地面接收到的反射波信号的处理和辨识，用于解...

• ### 几道和「黑洞照片」那种海量数据有关的算法问题

昨晚被一则新闻刷屏：北京时间 4 月 10 日今晚 9 点，人类首张黑洞照片正式发布。

• ### Python3网络爬虫(二)：利用urllib.urlopen向有道翻译发送数据获得翻译结果

运行平台：Windows Python版本：Python3.x IDE：Sublime text3     上一篇内容，已经学会了使用简单的语句对网页进行抓...

• ### sparksql比hivesql优化的点（窗口函数）

有时候，一个 select 语句中包含多个窗口函数，它们的窗口定义（OVER 子句）可能相同、也可能不同。

• ### 一个玩游戏的失足青年，转行做游戏开发到教育的挣扎过程

14年的IT从业经历，中专毕业后在小镇上开过网吧。在网吧一年多的时间里，天天陪人玩游戏，后来去读了一个三流计算机专业，毕业后转做软件开发，最近五年转入游戏开发行...

DSPSTACK.COM站长