看懂本文需要读者具备一定的微积分基础、至少开始学信号与系统了
本文主要讲解欧拉公式、傅里叶变换的频率轴的负半轴的意义、傅里叶变换的缺陷、为什么因果LTI系统可以被零极图几乎唯一确定等等容易被初学者忽略但对深入理解非常重要的细节问题
本文秉承尽量直观的原则,尽量少用纯数学推导,而多用形象直观的物理意义、几何意义、举例
作者的审美极度直男癌,本文的排版可能引起很多人不适,但本文的内容一定是亮点
作者还没本科毕业,水平有限,读者如发现本文的错误、读不懂的地方,恳请提出
全文原创,转载请标明出处

信号与系统是电子信息类专业的专业课,这门课看上去很像数学分析,不像模电数电电磁场微机原理那样与物理世界贴合得紧密、容易想象
信号与系统里存在δ(t)、复指数信号、非因果信号与系统等不存在于物理世界中的难以想象的东西,但它们在信号处理领域非常重要,为了帮大家建立直观理解,特地写作此文,以解决初学者们的一些疑问,这些疑问都是我初学的时候曾有过的

本文已假设读者掌握了

  • 极限、积分
  • 无穷级数、狄利克雷条件
  • 时域与频域
  • LTI系统

等知识点

卷积

LTI系统的输出信号=输入信号卷积LTI系统的单位冲激响应。卷积的积分表达式是∫-∞+∞f(τ)g(t-τ)dτ,乍一看感觉不知所云,咋又有t又有τ,其实这个表达式具有非常直观的物理意义,举个很简单的例子:

  • f(τ)是在τ时刻用一次会打出多颗子弹的枪命中敌人的子弹数
  • g(t)是敌人被命中1发子弹后的掉血函数,例如第1秒掉5血、第2秒掉3血、第3秒掉1血、然后不再掉。显然g(t-τ)是敌人在τ时刻被命中1发子弹后的掉血函数
  • t时刻敌人实际的掉血量是过去和当前命中的子弹各自产生的作用求和
  • 把离散的子弹换成连续的激光束,那么上述的求和就成为积分

注意:卷积的积分表达式里的积分区间是τ∈[-∞,+∞],因为这样就能让公式适用于无穷长的被卷积函数
简而言之:卷积的物理意义是——输出信号=输入信号的各片段产生的各输出信号作用的总和

欧拉公式

早在高中数学就引入了复数(complex number),高中数学只说了√(-1)等于1个虚数单位,可以用i表示虚数单位,有虚部的数叫复数(complex number),只有虚部没有实部的数叫纯虚数(pure imaginary number)。高中数学并没帮我们对复数形成直观理解,它只说了复数在电子技术等很多领域有非常广泛的应用,然后就是教如何计算复数的运算、在复平面表示复数

电子信息技术中,为了让虚数单位的符号不与表示电流的符号混淆,改用j表示1个虚数单位

复数、虚数的英文名字complex number、imaginary number,看上去是在说复数是复杂的数、虚数是想象出来的数,在知道虚数的英文名之前,我一直以为虚数的"虚"表示虚假,实际上应该表示虚构
虚数的英文名字imaginary number似乎表明了引入虚数的原因:实数不能满足需求,于是虚构出能满足需求的数即虚数。同时这也似乎表明虚数并不存在于物理世界中,否则干嘛还要"虚构"出虚数呢。欧拉公式阐述了虚数需要满足的"需求"是什么
推荐看这个直观的视频来了解欧拉公式
视频作者是斯坦福大学数学系毕业生,他在Youtube、Bilibili用名字3Blue1Brown发布了很多形象地展示数学之美的视频,推荐对数学感兴趣的同学们细品
弹幕中有很多还没上大学的中小学生发表的撞壁言论。为了让你自己专注于知识而非弹幕撕逼战,为了不被撞壁言论打击学习的积极性和自信心,建议关闭弹幕以保护智商。同时你也要保持对知识的敬畏之心,当你掌握更多知识之后,你可能会发现你之前对某些知识引以为傲的理解非常片面甚至错误

欧拉公式e=-1表明了虚数单位j在复平面上的作用:乘j相当于绕原点逆时针旋转90°,乘e相当于绕原点逆时针旋转α rad

LTI系统的特征信号

任何满足狄利克雷条件的周期函数都可以被展开为三角级数,欧拉公式又表明任一三角函数能展开为一对频率、瞬时相位都互为相反数的复指数函数之和
信号与系统教材已用纯数学手段证明复指数信号是LTI系统的特征信号,即如果把铺满整个时间轴的复指数信号输入给LTI系统,那么LTI系统的输出信号一定是铺满整个时间轴的同频的复指数信号,可能只是相位、幅度发生变化
物理世界的所有信号都功率有限(即振幅有限、斜率有限)、能量有限(即不会无止境地存在),天然地满足狄利克雷条件
显然如果LTI系统总是对频率互为相反数的复指数信号具有互为相反数的相移、相同的幅度增益/衰减,那么把铺满整个时间轴的正弦信号输入给LTI系统,LTI系统的输出信号也一定是铺满整个时间轴的同频正弦信号,可能只是相位、幅度发生变化,从而正弦信号也能是LTI系统的特征信号
幸运的是物理世界的LTI系统能将正弦信号作为特征信号

如果能知道物理世界的LTI系统对各个频率的正弦信号会产生多大的增益/衰减、多大的相移 、知道信号里的各种正弦频率成分的幅度、初始相位,根据LTI系统的线性性质,也能得知输出信号的波形
就像模电教材分析电路的频率特性总是拿正弦信号作为输入信号。得知电路对感兴趣的频率的正弦信号的相移、增益/衰减,就得知了这个电路的频率特性
你现在可能觉得这比在时域上x(t)*h(t)麻烦一些,但你得注意到:
在现实世界中可能造出完美的δ(t)吗?造出的δ(t)的持续时间是不是无穷小?能测量出持续时间就说明持续时间不是无穷小。既然弄不出完美的δ(t)那又怎么得知精准的h(t)?
有些情况下的信号处理任务在频域下进行,例如你很可能见过的音频播放器软件或者音响设备控制台的均衡器(equalizer),可能长这样:

图中的这个均衡器的顶部表示正弦频率、底部表示增益/衰减程度(正比于以某个统一值为底数的增益/衰减倍数的对数),显然图中的均衡器的目标是提升声音中的低频、高频分量幅度,衰减中频分量幅度,有的均衡器设置能让100块钱的音响放出1000块钱的效果
在音频均衡器的例子中,推导出输出信号需要知道输入信号中感兴趣的频率的幅度

如何知道系统对各频率成分的增益/衰减、滞后/超前?信号与系统教材已经证明过LTI系统的单位冲激响应h(t)的傅里叶变换就能体现LTI系统的特性。这很好理解,δ(t)包含所有频率分量,知道LTI系统对输入信号是δ(t)时的响应,就相当于知道了LTI系统对所有频率的响应
下面就来这个问题:如何知道信号里各正弦频率成分的幅度、初始相位

正弦函数的正交性、连续时间傅里叶变换

高等数学讲过三角函数具备正交性,即两个不同频率的正弦函数的积函数,在积函数的整数个周期内的积分是0,也可以用更直观的方式展现这个特点:
不妨记这2个频率分别为Ω1Ω2,积函数为cosΩ1tcosΩ2t,直接计算积函数的积分可能很困难,但是可以借助欧拉公式来简化
把cosΩ1t、cosΩ2t都展开为复指数的和的表达式,然后乘开乘积,再把频率互为相反数的复指数函数合并为正弦函数
所以cosΩ1tcosΩ2t=[cos(Ω1+Ω2)t+cos(Ω1-Ω2)t]/2,再算积分就非常简单了:

  • 如果Ω1=Ω2,那么cos(Ω1-Ω2)t就成为常数1,这时cosΩ1tcosΩ2t≥0,从而无论在哪段t上积分,结果都非0
  • 如果Ω1Ω2,那么显然在积函数的整数个周期内cos(Ω1+Ω2)t和cos(Ω1-Ω2)t的积分都是0

前面说了虚数是虚构出来的,它并不存在于物理世界,物理世界的信号都是实信号,所以可以利用正弦函数的正交性来计算信号里某个正弦频率分量有多少
再结合高等数学推导出的"周期趋于+∞时的三角级数"的知识,可以把物理世界的信号(记为x(t))写为无穷个不同频率的正弦信号的线性组合,如果想知道这个线性组合里Ω0分量有多少,那就计算x(t)cos(Ω0t)的积分,积分区间必须盖住x(t)有值的时间段,干脆就设为cos(Ω0t)的无穷个周期即铺满整个时间轴吧,反正x(t)=0的时刻完全不影响积分值,而且能保证积分区间一定盖满x(t)非0的时间段

但是仍然存在问题:

  • 积分值无法反映x(t)中的Ω0分量在t=0时刻的相位
  • 如果积分时间段不是cos(Ω0t)的整数个周期,那么cos(Ω0t)的初始相位会影响积分值;

于是引出傅里叶变换

傅里叶变换的思路和前文所述的以正弦信号为基分解信号的思路相当,只是傅里叶变换的基是物理世界并不存在的复指数信号
很好理解基是正弦信号的情况,也可以用欧拉公式把正弦信号基分解为一对复指数信号基,从而理解基是复指数信号的情况。但还有一种更直观地理解基是复指数信号的情况的方法,推荐看看这个视频这个视频依然是3Blue1Brown的作品,依然建议关闭弹幕、保护智商

视频为了能演示,选用的信号长度是有限的
如视频中的操作:根据欧拉公式的几何含义,把x(t)e-jΩt看作把x(t)在复平面上从相角为0的地方、绕着原点、向逆时针方向、以角速度Ωrad/s旋转铺开,如果信号中真的含有e-jΩt,那么旋转铺开得到的形状肯定会显然不关于原点对称,从而质心明显偏离原点;

如果信号不包含e-jΩt,那么旋转铺开得到的形状就会非常像关于原点中心对称,从而质心离原点很近

同时也容易想象到:如果信号的初始相位变化,那么最终旋转铺开得到的形状会绕原点旋转,从而很容易理解从原点指到质心的相量的模能反映信号中e-jΩt的振幅、幅角能反映信号中e-jΩt的初始相位

对一个信号,取从-∞到+∞的所有复指数频率,进行上面的操作,得到各复指数频率下对应的质心在复平面的坐标值,这就是连续时间傅里叶变换(The Continuous-Time Fourier Transform,简称CTFT),记x(t)的傅里叶变换为X(Ω)

再看傅里叶变换的公式X(Ω)=∫-∞+∞x(t)e-jΩtdt,有没有感觉这个公式非常直观

你可能仍有疑问,例如视频中这个时域信号的幅频图,在时域信号并不包含的频率处并不是0,而是有波动

这是因为参与变换的时域信号有限长,如果时域信号持续时间不是e0t的整数倍,那么旋转铺开的形状并不密闭,就像下图这样,下图中的绿色波形最右侧的线条没有闭合,所以这个形状的质心并没落在原点

如果让信号持续的时间再长几倍,那么这个不完整的形状就会更趋于完整,从而质心离原点更近
这个现象非常像数字信号处理中的频谱泄露
视频作者说他在下一个视频中讨论这个问题,按作者在YouTube发布视频的顺序,"下个视频"是这个视频。依然建议大家关闭弹幕保护智商

如果要画傅里叶变换的图谱,横轴为复指数频率,那么在平面上是做不到让一维的纵轴表示视频里的质心的二维坐标的。那就分出2个图谱吧,纵轴分别是幅度和相移,这2个图谱分别叫幅频谱和相频谱

傅里叶变换的缺陷

为了直观,下面所有参与变换的信号x(t)都是实信号。看懂了实信号,分析物理世界并不存在的复信号也能触类旁通

考虑从t=0开始由cosπtn(n为整数)个周期首尾拼接成的信号x(t),用傅里叶变换计算x(t)里e-jπt的幅度时
(1)如果n=1,原本铺满整个时间轴的积分区间就相当于是t从0到2,因为x(t)=0的时刻对积分无贡献。记计算得到的e-jπt的"幅度"为|X1|
(2)如果n=2、让时域波形振幅减半,积分区间相当于是t从0到4,是刚才的2倍,但由于振幅减半,所以积分表达式前面需要乘0.5,计算得到的e-jπt的"幅度"仍为|X1|
再按照傅里叶变换的公式算出上述2中情况下的相频表达式,可得这2种情况下e-jπt的振幅、初始相位完全一样,但显然违背直觉

(3)如果取n=2,不改变波形振幅,则这时计算得到的e-jπt的"幅度"为2|X1|
(1)、(3)中x(t)中的cosπt的幅度根本没有变化,变化的只是cosπt的周期数即积分区间,导致计算得到的|X(Ω)|变化了

显然傅里叶变换计算出的|X(Ω0)|正比于x(t)非0时,频率为Ω0的复指数信号分量的幅度×持续时长

如果x(t)中Ω0分量铺满整个时间轴,例如x(t)=cos(Ω0t),那么显然根据公式计算得|X(Ω0)|趋于+∞
这时的x(t)显然不满足狄利克雷条件,按理说不能做傅里叶变换,但拿出傅里叶变换频谱的物理意义,很容易画出这时的x(t)的幅频谱、相频谱的形状,不考虑幅频谱中的谱线值的绝对值的话

是不是感觉很矛盾?|X(Ω)|并不能100%地反映x(t)非0的时间段内e-jΩt的幅度、不满足狄利克雷条件的信号也能有傅里叶变换

于是我去搜索为什么傅里叶变换算出的幅度值无法绝对表示信号中的频率分量的幅度,遗憾的是靠前的汉语搜索结果没一个符合我描述的意思

于是换用英语搜索,看上去靠前的第1、4、5个英语搜索结果都符合我描述的意思

我爱汉语,希望我们的汉语互联网也能这么开放互联、信息也能这么丰富

尽管上图中的英文搜索结果里的回答也是网友们写的,不能算是绝对权威,但他们说的也很有道理。英文搜索结果里的回复表达的意思与本文下面根据Adobe Audition的幅频图和其它必要信息还原出时域信号的方法相同。那么难道说教科书上说的是错的?
并不是。如果能写出X(Ω)的表达式,那么一定能唯一确定x(t)的形状,这已被数学证明过,不会有错

信号与系统教科书里讲傅里叶变换的方式更像是数学家们思考的方式,和工程实际还有一定差别,和你能想象出的物理世界的实情也有一定差别,比如物理世界哪有cos(+∞t)?物理世界中当幅度小于一定值的时候,信号已几乎无法被测量到,但数学家告诉你,正是无数个这样测不到的信号分量导致了最终结果的巨大差异

接下来看看工程实际中是如何用傅里叶变换进行频谱分析的。工程实际中广泛运用计算机计算傅里叶变换,这涉及到数字信号处理,本文不涉及到数字信号处理

单看傅里叶变换的表达式无法判断基的确切长度,因为只要基在t=0时相位为0、基的持续时间段盖满信号的持续时间段,那么积分结果就不会受到基的长度的影响
再看傅里叶逆变换的表达式x(t)=(∫-∞+∞X(Ω)e-jΩtdΩ)/2π。被积函数是X(Ω)e-jΩt,它铺满整个时间轴,即傅里叶变换的基铺满整个时间轴

基无限长是存在一些缺陷的,比如信号当①没铺满整个时间轴或②非周期或③周期非常长等等
以①举例(其实刚才举过),假设一首歌的时长是1分钟,那么把这首歌以铺满整个时间轴的不同频率正弦函数为基进行分解,得到的结果无法反映某个具体的时刻下这首歌的特征,例如在这首歌已经放完了的t=2分钟时根本听不到任何声音,但傅里叶变换告诉你此时依然有各种频率的分量,这显然违背直觉

为什么要把基设为铺满时间轴呢?我猜测是为了让基严格满足LTI系统的特征信号的条件,本文推荐的第3个视频也表达了类似观点
如果输入信号有限长,那么输入信号从非0开始变为全0的片段,无法保证输入给LTI系统后,输出的信号能保持原样、最多只存在幅度和相位的区别

但是在工程实际中没必要总是把基设为铺满整个时间轴啊,持续1小时、1分钟、半分钟的1kHz声音无法让机器检测出1kHz分量吗,当然可以。但是持续1秒、0.5秒、0.00001秒就可能无法让精密的机器检测出了。所以这涉及到选定基的长度、参与变换的信号片段长度的问题(本文提到的第3个视频也讨论过这个问题。这个问题类似于数字信号处理里的频谱的物理分辨率)
为了解决傅里叶变换的上述缺陷,于是有了短时傅里叶变换、小波变换。我搜到过很形象地演示小波变换的原理的文章,还排在搜索引擎结果很靠前的位置,例如这篇

有的信号,各频率分量幅度的绝对值并不重要,而相对值很重要,例如语音信号。显然如果把某个语音信号x(t)中所有的频率分量的幅度全部同时扩大到相同倍数,就像扭动音响设备控制台的总音量旋钮,那么x(t)包含的信息完全没有变化,依然能听出x(t)被放大之前所传达的信息

其实也很好理解:话筒把声音转成微弱的电信号后,这个电信号肯定会被模数转换器(analog to digit converter,ADC)的前端电路处理得恰好铺满ADC的模拟输入端的输入范围(其实不会恰好铺满,而是会留有一定裕量)以充分利用ADC的精度

对ADC和听声音的人来说,话筒转换得到的电信号的幅度的绝对值没有意义。用专业些的音频处理软件Adobe Audition来举例:

Audition的傅里叶变换是短时傅里叶变换(其实是数字信号处理里的离散傅里叶变换,不过离散傅里叶变换选用的信号片段长度确实是"短时"的),每次变换所用的信号并不是整个音频文件,而是可以由用户设定使用多长的信号片段,现在只关注Audition的幅频图的纵轴

Audition的幅频图的纵轴标注的刻度以分贝(decibel,简称dB)为单位,分贝可以表示倍数。工程中出现的倍数可能在末尾或者紧挨着小数点右侧有非常多的0,为了让人类看这样的倍数时不用把精力浪费在仔细地数0的个数上,于是分贝诞生了
如果用分贝表示2个电压值U1U2之间的倍数关系,那么可以把U1定义为0dB,计算出U2=20lg(U2/U1)dB
如果用分贝表示2个功率值P1P2之间的倍数关系,如果把P1定义为0dB,计算P2时,却应该是P2=10lg(P2/P1)dB,因为如果用电压U表示功率PP正比于U2U扩大至k倍后,P会扩大至k2倍,P已暗含了平方关系,类似地,用分贝表示暗含了平方关系的物理量之间的倍数关系时,对数式前乘的系数都是10

再看上图:纵轴刻度的最大值是0dB=1倍,纵轴向下是负的分贝
所以Audition的幅频谱把能达到的最大幅度定为0dB,其它幅度的值根据它相对于0dB的比例计算出。这个幅频谱没有反映频率分量幅度的绝对值,而反映了相对值。这样反映出的幅度也叫归一化(normalized)幅度,就是把最大的值定为1,其它值根据它占最大值的比例算得。同学们以后会经常碰到"归一化"这个词
如果频率分量的幅度的绝对值重要、而幅频谱仍然像Audition的这样只给出各频率分量幅度的相对值,那就再规定幅频谱里的0dB表示的绝对值是多少,这样就能算出所有频率分量幅度的绝对值啦;再拿到相频谱、规定参与变换的时域信号的长度,那么就一定能还原出时域信号。注意看这段话里的红色字,它们都是工程实际中还原出时域信号必备的信息,缺一不可

滤波器

再来看前面的音频均衡器的例子,图中推子的连线像不像幅频曲线?

一些音乐软件有音质优化功能,这个功能里预设了一些效果曲线,比如一些预设效果叫室内、KTV、金属、人声等等,每个预设效果都对应着一条声音调整曲线。可以说每个预设效果都是一个滤波器(filter),预设效果对应的声音调整曲线就是这个滤波器的幅频图
滤波器是信号处理领域非常重要的研究课题,LTI系统就是典型的滤波器
滤波器嘛,顾名思义,滤除不想要的波形用的。其实不止滤除波形,滤波器还能提升需要的波形的幅度。都说了幅频图里的谱线的绝对值不重要,只提升想保留的频率的幅度算不算是抑制不想要的频率的幅度?

计算傅里叶变换时的一些细节问题

本节进行变换时把时域信号当作无穷长,选用的基也铺满整个时间轴。反正你的作业和考试就是这么设定的
同样为了直观,参与变换的信号x(t)依然是实信号

以复指数信号为基分解实信号,为了让这些基最终拟合出的虚部是0,那么显然频率互为相反数的复指数信号的幅度相同、瞬时相位互为相反数(你要说幅度互为相反数、瞬时相位相同也没错,但习惯上不这么说)

x(t)是周期信号,不妨设x(t)=cost+2cos2t

如果用短时傅里叶变换:根据傅里叶变换的物理意义,傅里叶变换的基是铺满整个时域的不同频率的单频复指数信号,显然幅频图中复指数频率1、-1、2、-2的谱线长度非0,且1、-1的谱线长度是2、-2的谱线长度的一半,其它所有复指数频率的谱线长度都是0,规定复指数频率Ω=1的分量的幅度是1;幅度非0的复指数频率的初始相位都是0;选用的基铺满整个时间轴

按照教科书教的计算:这个信号完全不满足狄利克雷条件,但是引入冲激信号δ(t)之后,可以认为复指数频率1、-1的幅度是δ(t)、复指数频率2、-2的幅度是2δ(t);幅度非0的复指数频率分量的初始相位都是0。即复指数频率为1的分量的幅度是1个单位的+∞、复指数频率为2的分量的幅度是2个单位的+∞

x(t)仍然是周期信号,不妨设周期是T0

幅频图上,非0的正弦频率的频率一定是1/T0 Hz的整数倍,其它频率处严格为0,否则x(t)的周期不可能是T0。幅频图中的1/T0 Hz、2/T0 Hz、3/T0 Hz、……、n/T0 Hz的分量就是x(t)中的基波、二次谐波、三次谐波、……、n次谐波
这就是"时域周期则频域离散、非周期"
同上,基波和各次谐波的幅度都是(t),k是常数

x(t)有限长

用铺满整个时间轴的基去拟合有限长的信号,看上去无法在x(t)彻底为0的时刻严格地拟合得到0,所以必须提升拟合精度,即频谱图铺满整个频率轴
这时一个数学家跳出来说:我说基取遍所有频率能严格拟合物理世界的所有信号就能严格拟合
咱又不能真的实现"把所有频率的铺满整个时间轴的基都取遍,加起来看看是不是有限长的x(t)的时域波形",那么数学家说是就是吧,工程师和物理学家不都只有经常从数学家的乐(lè)色桶里捡乐色才能维持的了研究

形象地展示信号与系统中的一些细节和原理——卷积、复数、傅里叶变换、拉普拉斯变换、零极图唯一确定因果LTI系统的更多相关文章

  1. 单自由度系统中质量、阻尼和刚度变化对频率响应函数(FRF)影响图的绘制

    作者:赵兵 日期:2020-02-17 目录 单自由度系统中质量.阻尼和刚度变化对频率响应函数(FRF)影响图的绘制 1.     背景 2.     VISIO绘制 3.     Matlab绘制 ...

  2. linux(七)之linux系统中查找文件

    前面介绍一篇文章介绍了关于vi编辑器的使用,感觉是不是那么多的命令怎么记得住呀,小编也是这样让认为的,但是慢慢的发现,其实还是很有意思的.正所谓熟能生巧多练习,找到其中的规律就ok了.今天看到一句话让 ...

  3. Windows下USB磁盘开发系列一:枚举系统中U盘的盘符

    个时候我们需要区分系统磁盘中,哪些是U盘,这样我们在访问的时候可以区别对待.具体方法如下: 1,调用GetLogicalDrives()返回系统盘符标记位 API GetLogicalDrives() ...

  4. ubuntu系统中java -version所显示的版本与/etc/profile中配置的$JAVA_HOME的关系

    问题产生 ubuntu 18.04环境下,执行 java -version 发现与/etc/profile中的$JAVA_HOME所设置的java版本不同. 推测原因 最近用apt install 安 ...

  5. Systemd初始化进程/RHEL 6系统中System V init命令与RHEL 7系统中systemctl命令的对比

    Linux操作系统的开机过程是这样的,即从BIOS开始,然后进入Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程.初始化进程作为Linux系统的第一个进程,它需要完成Li ...

  6. Linux CentOS7系统中phpMyAdmin安装配置

    今天介绍的是如何在Linux CentOS7系统中配置phpMyAdmin. 目录 环境准备 安装包 基本设置 网站预览 环境准备 linux centos7系统 ssh软件 php语言环境 mysq ...

  7. Linux系统中python默认版本为python2.7,修改为python3 项目上传码云

    # 查询系统本系统中安装的python版本 ls -l /usr/bin/python* 1.在虚拟机上新建虚拟环境 # 系统中python默认版本为python2.,可以将其修改为python3 # ...

  8. linux系统中离线安装python3.7过程记录

    最近公司新弄来一台linux  redhat 4.4.7服务器,准备在上面离线安装python3.7,安装过程中出现一些问题,特此记录下来. 首先在python官网上下载了 Python-3.7.3. ...

  9. 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本

    目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...

随机推荐

  1. Building Applications with Force.com and VisualForce (DEV401) (二五):Visualforce Controller

    Dev401-026:Visualforce Pages: Visualforce Controller   Module Objectives1.Identify the functionality ...

  2. JAVA——桌球游戏(动画)

    跟着视频敲得 ,虽然不是自己的思路 ,不过对代码多了一点了解:涉及到继承类 主函数:创建一个BallGame对象,调用一个launchFrame函数 : launchFrame函数:严格来说是方法 , ...

  3. gunicorn的作用

    gunicorn是什么: gunicorn是一种unix上被广泛使用的Python WSGI UNIX HTTP Server WSGI是什么: 先说下 WSGI 的表面意思,Web Server G ...

  4. VS2015 远程调试:Remote Debugger

    一.关于Remote Debugger 使用VS远程调试器Remote Debugger,我们可以调试部署在不同机器上的应用程序,如桌面应用程序和Asp.Net应用程序. 二.Remote Debug ...

  5. Ubuntu系统安装wxPython问题

    wxPython介绍 wxPython是Python语言的GUI工具包,作为Python的扩展模块实现,包装了wxWidgets.wxPython是跨平台的,开源的.详情 wxPython安装 (1) ...

  6. Mybatis多表关联查询字段值覆盖问题

    一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...

  7. Flutter 完美的验证码输入框

    老孟导读:刚开始看到这个功能的时候一定觉得so easy,开始的时候我也是这么觉得的,这还不简单,然而真正写的时候才发现并没有想象的那么简单. 先上图,不上图你们都不想看,我难啊,到Github:ht ...

  8. K - 回转寿司(值域段数(板题) + 动态开点)

    回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个 ...

  9. touch多点触摸事件

    touch--单点 targetTouches. changeTouches 多点: targetTouches--当前物体上的手指数 *不同物体上的手指不会互相干扰 不需要做多点触摸的时候---平均 ...

  10. eclipse报错:problems during content assist

    自动提示出错: 解决办法:Windows->preferences->java->editor->content assist->advanced 取消java prop ...