June 2019

C语言使用GTK3实现屏幕截图

1.将以下代码保存到screenshot.c中

Continue reading...

GTK3 gdk_pixbuf_get_from_window 运行错误segmentation fault (core dumped)

函数调用如上,问题出现在没有用可变参数,却同时也没有给可变参数赋值为NULL.

看官方文档发现了这句话:

The variable argument list should be NULL; if not empty, it should contain pairs of strings that modify the save parameters.

如果可变参数列表为空,是需要赋值为NULL的。

虽然没有赋值NULL不会报错,但是执行的时候会发生段错误,应当注意这个细节。…

Continue reading...

Bash截取字符串批量重命名文件

文件状态:

以下为bash脚本内容, 将其写入文件newname.sh.

终端执行下列命令赋予执行权限,再sh运行脚本:

批量重命名成功:

 …

Continue reading...

绘图软件Dot设置输出图像分辨率

将以上内容保存到sockaddr.dot, 终端执行以下命令

以上通过-Gdpi参数来设置分辨率。

Continue reading...

如何画出复指数信号e^(jwt) 和 e^(-jwt)?

可以使用gnuplot这个工具作图,还是很方便的,

$ e^{-j\omega t} 和 e^{j\omega t}$都是向着t螺旋前进的曲线,但是旋转方向不同,下面就$e^{j\omega t}$举例。

要在复频域画出来,首先定义Z轴为虚轴j,X轴为时间轴t,Y轴还是原来的Y轴,

$e^{j\omega t} = cos(\omega t) + j sin(\omega t)$

拆成$y = cos(\omega t)$ 和$z = sin(\omega t)$

就像在二维平面,$x+iy 代表的点为(x, y)$一样,此处$e^{j\omega t} = cos(\omega t) + j sin(\omega t)$代表的就是空间上的点$(t, y, z)$ 或者说$(x, y, z)$,即$(t, cos(\omega t), sin(\omega t))$,影响不大,因为我们已经把x轴作为t轴。

所以我们只要求出t取不同值的时候,$cos(\omega t)和sin(\omega t)$的值,然后进行描点画线即可。

具体参看这篇文章:Gnuplot 直接读取变量值进行描点连线

Continue reading...

什么是纯滞后环节,为什么叫纯滞后环节?

设$G(s) = \frac{4}{s(0.5s+1)}$    $T=0.5$, 经过一个零阶保持器:

$G(z) = Z[\frac{1-e^{-sT}}{s}G(s)] = \frac{0.736z^{-1}(1+0.177z^{-1})}{(1-z^{-1})(1-0.368z^{-1})}$

其中分子中的$z^{-1}$就是纯滞后环节。

因为$z^{-n}$对应的时域表达式是$\delta(t-nT)$, 其他信号乘上这个冲激信号,输出都会在时域上延迟nT的时间,所以称其对应的Z变换为滞后环节。…

Continue reading...

零阶保持器的s以及z传递函数推导过程

零阶保持器的定义与作用:

零阶保持器:zero-order holder(ZOH),是指实现采样点之间插值的元件。零阶保持器基于时域外推原理,能够把采样信号转换成连续信号

 

零阶保持器的作用是在信号传递过程中,把第nT时刻的采样信号值一直保持到第(n+1)T时刻的前一瞬时,把第(n+1)T时刻的采样值一直保持到(n+2)T时刻,依次类推,从而把一个脉冲序列变成一个连续的阶梯信号。

则根据其作用可以用图形表示为:

用阶跃信号u(t)减去另一个阶跃信号u(t-T)

根据傅里叶变换:

$ F(s) = \int_{-\infty}^{+\infty} f(t)e^{-st}dt $

对零阶保持器的时域表达式进行转换得:

$F(s) = \int_{-\infty}^{+\infty}{[u(t) – u(t-T)]} e^{-st}dt$

$ = \int_{-\infty}^{+\infty} u(t) e^{-st}dt – \int_{-\infty}^{+\infty}u(t-T)e^{-st}dt$

$ = \int_{0}^{+\infty} e^{-st}dt   –  \int_{T}^{+\infty} e^{-st}dt $

$ = (-\frac{1}{s} e^{-st}|^{+\infty}_{0})  –  (-\frac{1}{s} e^{-st}|^{+\infty}_{T})$

$ = 0 – (-\frac{1}{s}) + 0 – \frac{e^{-sT}}{s} $

$ = \frac{1-e^{-sT}}{s} $

以上傅里叶变换其实可用其一些特性快速解决,不过为了保持逻辑的连贯性和揭露本质,直接用定义求解。

关于积分上下限分别是$(0, \infty)$和$ (T, \infty) $,是因为u(t)在t<=0时是没有值的,而u(t-T)在t<T没有值。两者图形如下(绘图的gnuplot命令见这篇文章:gnuplot绘制坐标轴):

接下来求解其Z变换, 由于系统是因果的,时间不存在小于0,应选用单边Z变换。

由于Z变换是针对离散序列,所以需要对阶跃函数离散化,用阶跃序列1(kT)表示,其中T是周期,k=1,2,3…表示第k个时间T, 函数能取到的值为1.

根据单边Z变换公式:

$ F(z) = \sum^\infty_{k=0} f(kT) z^{-k} $

可得阶跃序列的单边Z变换为:

$ F(z) = \sum^\infty_{k=0} 1(kT) z^{-k} =  \sum^\infty_{k=0} z^{-k} $

根据等比数列求和公式,可得上式:

$ = \frac{1-z^{-k}z^{-1}}{1-z^{-1}} $

$ = \frac{z-\frac{1}{z^k}}{z-1} $

当$|z|>1$时,$ lim_{k\to \infty} = 0 $, 上式可化简为:

$ F(z) = \frac{z}{z-1}$                  $  |z| > 1 $

同理,u(t-T)对应的离散序列u(kT-T)的单边Z变换为$ F(z) = \frac{1}{z-1}$

$ \rightarrow $ 零阶保持器的单边Z变换为  :

$ \frac{z}{z-1} – \frac{1}{z-1} = 1$

为什么是1呢?

因为, 输入的采样信号是离散的,零阶保持器的时域函数在时间T以前的离散化只有一个值,位于0点,是一个冲激函数,而且不能改变输入的幅值,所以为1。

不过,求取这个没有多少意义,只是让我们知道了这是对应了实际意义的,在一般求解的过程中要计算零阶保持器s传递函数乘于执行结构的s传递函数再求二者乘积的Z变换。…

Continue reading...

Gnuplot绘制坐标轴

Continue reading...