Blogs

用python冒险

杰森萨赫斯2013年6月23日11评论

作者’注意:本文最初被称为 用python信号处理冒险(Matlab?我们不’不需要臭名臭名臭椿!) — the allusion to 塞勒马雷的宝藏 已被删除,尊重是Mathworks的好邻居。我不喜欢’这是我对matlab许多方面不喜欢的秘密—我在这篇文章中提到了哪个—我希望他们能改善他们的软件并降低价格。请注意这代表了我自己的意见,并不反映我的雇主或本网站的意见’s publisher.

好的,现在回到一些脚踏实地的主题之后 最后的哲学转移。这篇文章将是幽门之旅,以及一些其他主题的跳板—包括那些已久的续集 编码器速度估计.

在工作中,我们使用MATLAB作为数据分析和可视化软件。但我的团队只有在共享的笔记本电脑上可用。而且我厌倦了不得不分享。 :–)所以我开始看替代品。

本文以PDF格式提供,便于打印

Scilab,Octave,Sage ......一切都是片状的,而且没有’似乎有我想要的特征和丰富。然后我发现了 Pylab..

Pylab是一个用于科学计算的Python环境,包括以下包:

  • matplotlib. 用于图形和数据可视化
  • numpy. 对于基本数值分析(对其运行的矩阵,矩阵和科学函数)
  • scipy 用于科学和工程应用。

坚持一分钟—这是一个嵌入式系统博客,对吧?! Python赢了’T在资源有限的嵌入式系统上运行,实际上Python是我的三个标准之一......

签字你是谁’T在资源有限的嵌入式系统上工作:

  1. 您有一个带有命令shell的操作系统。
  2. 你可以运行python。
  3. 那里’s在系统上运行的编译器,所以你不’T需要一个交叉编译器。

所以,如果你’re using Python, you’重复没有真正做嵌入式系统开发。但是’好的。因为你需要扩展你的视野。大学教师’T是一个单窍门的小马,并陷入C和装配开发,为您最喜欢的优选处理器!

无论如何,那里’在我必须停止编程并试用我拥有的一些想法的理论时,很多时候。最近的幽灵一直在巨大的帮助。

这里 are some examples of what it can do. But first, a caveat:

我们 需要stinkin'matlab?!

我需要清楚的是,这篇文章旨在针对具有信号处理,数据分析和可视化工作的工程师(特别是嵌入式系统开发人员)作为其工作的次要部分。

对于那些正在进行全职,铁杆信号处理或控制系统设计的人来说,Matlab可能是作业的正确工具。如果您的公司每周支付40小时的费用,他们也可能负担得起Matlab。

如果成本是’t an issue, I’d喜欢使用matlab,我’D获取我可以的所有工具箱。

我也不会展现对信号处理或控制系统算法的深入讨论(Z变换,FFT,根轨迹图,Nichols图表等)。和我’M不会告诉您使用Python和Pylab的分步说明。这只是幽门之旅,以引人兴趣。

示例应用程序

假设您需要了解具有归纳负载的H桥中的纹波电流,在边缘对齐和中心对齐的脉冲宽度调制下。

这里’S一些纹波电流的曲线,以及我曾经生产的短Python脚本:

边缘对齐的PWM: 图像

中心对齐的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)
    ax = fig.add_subplot(3,1,1)
    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 = fig.add_subplot(3,1,2)
    ax.plot(t,Vab)
    ax.set_ylim(createLimits(margin,Vab))
    ax.set_ylabel('Load voltage')

    ax = fig.add_subplot(3,1,3)
    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()

或者将两个2级RC滤波器进行比较,其中一个具有相同的RC和第二阶段的阻抗增加10以减少加载(注意:下面的原理图不是从Python绘制而是手动绘制 电路):

图像

图像

再次,这里’S短源代码:

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 = fig.add_subplot(3,1,k+1)
    ax.plot(tus,Vin,tus,Vc)
    ax.legend(['Vin','Vc1','Vc2'])
    ax.set_ylabel(ylabels[k])
    ax.grid('on')

ax = fig.add_subplot(3,1,3)
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()  

或者使用 ysmpy. Python的符号代数包,计算分段线性段的平均平方值:

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))

你甚至可以自己试试这个 Sympy Live Server:

图像

安装

核心Python安装非常简单; osx用户用python安装在框中,但无论您的操作系统如何,都有 Python.org上的预编译二进制文件。如果要安装scipy / numpy / matplotlib库,则会收到一点点棘手,而无需依赖安装正确的编译器环境。

那里 are some good solutions 在scipy.org网站上列出;我以为我’D也分享自己的经历。我不’T使用Linux拥有经验,因此请检查Scipy.org页面。

视窗

那里 are three free prepackaged versions of PyLab that I’ve used:

PortablePython.具有最可靠的安装/运行时。 Pythonxy具有最大的功能集(以及最大的安装大小)。大纲冠心不同; Enthough提供免费版本来试用它,如果您想要更多库,您可以购买不免费版本 —他们早期的分销,EPD,从命令线和我跑来努力’我不确定如何可靠地用大篷篷进行可靠。

那里’s also 蟒蛇,我’刚刚开始使用Mac OSX,但避风港’尚未尝试窗户。

Mac OSX.

I’在家里的Mac上运行雪豹(OSX 10.6)。我没有’对于Pylab而言,这是一个很好的解决方案,但却正在努力。

Pylab最简单的免费安装似乎是 蟒蛇。 来自连续性分析。安装很容易,它只是有效... Matplotlib安装拧紧。 GRRR。希望这些扭结会直观; Anaconda看起来非常有前途。

这 usual free-software process on Macs uses package managers like fink or MacPorts; the MacPorts process (sudo port install blahblahblah… from a command terminal) is kind of brittle, and if you have something wrong with your setup, the whole process comes to a halt, with a cryptic message.

Canopy在那里有OSX和Linux版本,但我避开了’t tried it yet.

It’也可以在各种包装中使用那里的预编译二进制文件。虽然Python预先安装在Mac上,但请确保您的Python版本与您安装的库兼容。一世’d建议安装一个Python的最新版本。在这里至少’s what you need:

matlab vs. python.

使用matlab的原因

  • It’尊重的软件,头部和肩部高于其他竞争对手
  • Simulink没有真正的替代品
  • 它具有快速矩阵数学,良好的调试器和特殊语法,以方便数值分析:
    • 阵列切片: A(:,5:10) = 33;
    • 序列创作: B = [1:3:30];
    • 数组连接: Brepeat = [B, B, B]; C = [B; B*2; B.*B];
  • 像SpTool等GUI工具(用于一般信号可视化和过滤)或FDATOOL(用于数字滤波器设计)
  • 用于高质量的专业级信号处理和控制系统设计

不使用matlab的原因

  • It’对于个别许可证昂贵! 在这份写作时,核心MATLAB的副本是美国\ 2150美元。那’在企业环境中并不那么糟糕,但乘以需要使用它的人数,以及他们所有其他工具箱都出售单点菜肴。
  • It’对于团体许可昂贵! 网络许可版本的MATLAB或其任何工具箱都花费4倍,作为单个PC的许可证。我可以’t say I’有史以来,有两个价格的待售带锯或车床,一个是个人用途,如果你想在几个人之间分享它,那么一个花费4倍。在我的旧公司,我们有7个Matlab的网络许可证,有40人在各种场合使用它—所以对于核心matlab程序,值得成本,但工具箱很少使用,所以我们不能’T证明购买了1多个工具箱许可证,在某些情况下我们可以’t依赖工具箱。我本来希望能够使用Matlab编译器,但网络许可证太昂贵了。其他软件程序在1.25-2.0范围内提供具有乘数的网络许可证,以证明能够在多个人中分享它的额外便利性’T同时使用许可证,但MathWorks是唯一的公司’曾经看过使用4倍乘数。
  • It’获得工具箱的昂贵只是为了在罕见场合使用一个功能! 所以你需要一年两三次的一些曲线拟合工具?那’S并不是足以证明购买A \ $ 1000曲线拟合工具箱。我认为最困惑的是Mathworks占据了他们的工具箱的态度。他们似乎对他们的客户尊重,好像他们都有深口袋。他们所有的网络研讨会和培训课程推广工具箱—那部分是可以的,但除非你问他们,否则他们从未提出过成本,而且他们不’T提供了理由,即技术人员可以使用管理层来备份购买\ $ 1000许可证的请求。通常存在位于工具箱中的平凡函数,该函数真正应该处于核心Matlab分布中。这里’s an example: the norminv() 函数位于统计工具箱;它’s通过使用来易于计算 erfinv() function built into MATLAB. But if someone working with you puts norminv() into their script because they have a license for Statistics Toolbox, then either have to get Statistics Toolbox, or rewrite their script to use erfinv().
  • 语法有时有点古怪。 数组编号从1开始启动。您可以选择具有后果的脚本文件(.m)或函数(.m):脚本文件可以’t有亚功能,并修改全球环境;函数文件可以具有子功能,并且唐’t修改全局环境。如果你忘了用分号结束一条线,它’s不是错误,但Matlab解释器将打印出一个值,我可以’T告诉你我有多少次’浪费了30分钟,试图找出该死的缺失分号的位置,所以我可以摆脱意外的印刷价值。 strcmp()返回0的不匹配和1的匹配项,它与返回-1,0,1的常规C版本不兼容,这取决于哪个字符串首先按顺序。我可以继续我’ll stop.
  • 命名空间管理很糟糕。 You want to keep your control systems gains out of Simulink models (akin to keeping hard-coded constants out of C code and in a separate .h file)? They have to go into the MATLAB base workspace. You can hack the sim() command into using the calling function’s workspace, but it’S有点棘手,不兼容Simulink的其他功能。对于MathWorks来说,它将是SOOOOOOOO,以允许将结构传递为Simulink的参数,该参数用作所有命名常量查找的源“From Workspace”块。唉,你可以’做它。同样的事情“To Workspace”Simulink中的块,它只将结果喷射到顶级工作区中,clobbobing您可能拥有的任何变量。 matlab确实有了 assignin() 函数,但它只有有限的工作空间选择,而且没有’T一流的工作区支持。

使用python的原因

  • It’S美丽,广泛使用的语言。数组编号从0开始,语言语法会更好地考虑,就像类系统一样。 Python中的模块/包装系统比MATLAB好得多’路径。我碰巧在Python中喜欢迭代器和发电机,这是aren’t in MATLAB.
  • matplotlib.就像matlab’s绘制实用程序,但改进,更易于使用。
  • 你也得到了所有漂亮的Python库。打开文件,迭代目录等都是更容易的。
  • 如果你 want a MATLAB-like environment, you can use the iPython. (交互式Python)shell,其中包括标签完成,调试on-on-subly“notebooks”记录您的探索。
  • numpy. / scipy / pandas库与matlab相当 一堆工具箱。例如,我最近能够使用Scipy的一些立方样条拟合功能。我会’除非我有曲线拟合工具箱,否则都能在matlab中做同样的事情。
  • It’s free!

使用python时放弃的东西

以下所有问题都是由Numpy是Python的附加库,与语言的一流特征的事实引起的。

  • 阵列文字aren’t as easy, you have to use numpy..array.([1,2,3])] instead of [1,2,3] if you want full matrix-aware math.
  • To operate on numpy arrays with elementary functions like sin()exp(), you need to explicitly use the numpy versions of these functions.
  • 数组连接isn.’t as easy, you have to use numpy..hstacknumpy..vstack instead of [A,B] or [A;B]

想了解有关Pylab的更多信息吗?

首先是:试试吧!

那里 are some great tutorials on scipy.org.。 Python普遍足够遍布互联网上的许多其他教程。 这里’s one 我发现看起来像一个良好的地方。

对于Python,一般来说,奥里利书 学习Python. is a classic —第五版只​​是关于临近出版物,但对于基础知识,你赢了’通过早期版本错过了很多。那里’s also 努力学习Python,可用作为在线系列练习。

其他资源

I’刚开始学习如何使用 熊猫iPython..

熊猫

熊猫 包包括使用Python进行数据分析的工具。 numpy和scipy库与n维数组一起使用。 Pandas库将命名和索引列和行添加到数组。如果你’曾经使用具有列标题的CSV文件,你知道我的意思。想象一下,从CSV文件中删除标题:您剩下的是一个矩阵,您必须记住列0是时间,列1-3是电机相位电压。熊猫库给你一个称为python类 dataframe.,它允许您使用有关每个行和列的信息进行注释矩阵。 Pandas.dataframe有很多其他的好东西用于此类数据的数字攻击。

想了解有关熊猫的更多信息吗?

iPython.

如果你’re used to the interactive shell in Matlab, IPython is for you. If you type ipython notebook --pylab inline it will start a webserver, open up your web browser, and pre-import the pylab libraries:

图像

如果你 forget the methods available from an object, you can just press the tab key to get interactive completion:

图像

如果你 start writing a function call and hesitate, IPython will prompt you with some basic help:

图像

然后’只是一开始。就像我说的那样,我’我仍然学习ipython。想了解更多吗?

结论

我越了解Python,越依赖于Matlab,我成为我所需要的数据分析和可视化任务。

记住:嵌入式系统开发ISN’T J只是编码。它’关于规划,在具有电子元件的真实系统的背景下规划,有时是机械部件。要制作更好的系统,可以通过分析它来拯救自己很多麻烦 您刚刚开始抛出嵌入的C代码。像Matlab和Python这样的工具可以提供帮助;如果你或你与唐的人’T可以访问Matlab,请尝试Python。

玩得开心!


©2013年杰森M. Sachs,保留所有权利。

[]
评论 Chuck79.2013年6月23日
你触动了这一点,但我认为强调Python是一种广泛接受的通用编程语言,具有令人惊叹的丰富,开源生态系统。虽然Matlab可能是一个塔德,但是对于它的域名中的事情而言,Python让您在许多域中玩耍。

我开始在Matlab中进行科学编程。切换到Python,因为我无法负担MATLAB许可证。然后结束了由于我的Python技能而做Web开发。现在我回到了一个为我提供了一个Matlab许可的公司的科学编程,但我坚持蟒蛇,因为它确实需要我需要的一切,并帮助我维护我的Python技能。
[]
评论 Scott16.2013年6月26日
检查Spyder(//code.google.com/p/spyderlib/)。找到它是让我完全移动到Python的原因。我所有的机器都安装了matlab,仍然选择python。
[]
评论 悲伤2016年1月4日
我也一直在使用spyder。在过去的6个月里,没有matlab ......哇!
[]
评论 markrages.2013年6月23日
Python非常适合代码生成,因为它具有出色的字符串操作支持。

我在这个chiphacker答案中提出了一个简单的例子: http://electronics.stackexchange.com/a/68083/411

这是一个简化的例子。但是,对于使用SCIPY的Remez算法,我可以在编译时生成FIR过滤器的代码不多,它使实验更容易。
[]
评论 Luke552013年6月27日
靠近所有PY文件的顶部:“从Numpy Import数组为”
并使用“a([1,2,3])”而不是“numpy..array.([1,2,3])]“,不如”[1 2 3]“,但无法使用”A“作为变量是为了方便起见的小价。
[]
评论 Cfelton.2013年8月2日
在numpy命名空间中,他们不融合“r_”。这旨在是缩短的。

>> x = r_[1,2,3,4,5]
[]
评论 hal98x2013年6月26日
我希望有人能提到工具箱的成本和您获得成本的功能的伟大文章。最大的所有jip都是互相关。您必须购买信号处理工具箱,只需在SCIP中获取此功能,它是免费的。

感谢您的资源,我正在从Matlab到Pylab的过渡。这是一个我发现非常有用的资源,用于学习Python语言。 //developers.google.com/edu/python/
[]
评论 丹姆布2016年12月21日

这看起来很有趣,我喜欢Python很多,我只是在学习DSP的东西。但是你给出的例子看起来像一个更适合众多香料包,没有?

[]
评论 JMS_NH.2016年12月21日

也许......但我讨厌香料。我从来没有能够在20年前的电路课程中使用它的任何东西。

Simulink是我发现更容易使用的东西,但它不是免费的。

我需要在我需要时使用simulink(在工作中),但只需用简单的系统搞乱,我将使用ipython笔记本。

[]
评论 丹姆布2016年12月21日

哈,足够公平。在所有诚实中,我更喜欢实际组件和一个范围。当我进入它时,可能会尽力为DSP的东西提供。看起来很有趣。


[]
评论 JMS_NH.2016年12月21日

也可以看看 scipy.signal.lsim2. 在LTI对象上工作,它是类似Matlab的传输函数对象和状态空间对象,但更具限制性。  

我在探索曲面近似值时常用于此(见 //www.dianjingline.icu/showarticle/927.ph...)。

要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录