JupyterHub

在浙江大学信号所的服务器上,采用JupyterHub搭建了供同学、老师们共享使用的开发网站,可以进行程序开发、文档撰写等工作。

该网站的域名为:https://hub.fwzju.com,需要在浙江大学校园网环境下访问。

What is JupyterHub?

JupyterHub brings the power of notebooks to groups of users. It gives users access to computational environments and resources without burdening the users with installation and maintenance tasks. Users - including students, researchers, and data scientists - can get their work done in their own workspaces on shared resources which can be managed efficiently by system administrators.

JupyterHub runs in the cloud or on your own hardware, and makes it possible to serve a pre-configured data science environment to any user in the world. It is customizable and scalable, and is suitable for small and large teams, academic courses, and large-scale infrastructure.

信号所在线开发网站

该网站主要采用Python3编程语言,另有gcc, gfortran等,可根据需求进行扩充。

具体的使用方法参见https://jupyter.org中的相关说明文档。

需要使用的同学、老师请发送邮件至< wfeng@zju.edu.cn>申请账号,请包含如下信息:

1
2
3
4
姓名:XX
导师或联系人姓名:XX
联系邮箱:XX
其他联系方式:13XX

如果需要搭建新的开发环境,请发送邮件至 wfeng@zju.edu.cn 对需求进行说明,在上述信息基础上补充如下信息:

1
2
3
4
开发环境关键词:
使用目的:
使用时间:
搭建方法:参考链接或说明文档

Tutorial for Git and Github

版本管理工具Git及相关网站等用法简单教程,默认采用Git bash for Windows,补充说明包括TortoiseGit, SourceTree等可视化工具的用法。

Git版本管理

  • 查看帮助:git --help,更多帮助:git help tutorial
  • 创建仓库:git init
    • TortoiseGit: 目录空白处右击选择Git create repo here
  • 添加需要管理的文件:git add [filename or directory]
  • 移动已管理的文件:git mv [src] [dst]
  • 删除已管理的文件:git rm [filename]
  • 提交本次修改内容:git commit
  • 查看修改历史:git log
    • TortoiseGit: 目录空白处右击TortoiseGit > Show log
  • 与之前版本比较差异:
    • TortoiseGit: 目录空白处右击TortoiseGit > Show Diff with previous version

Github代码托管与协作

Git SSH密钥配置

  • 通过Git GUI创建SSH key,用于与服务器端加密通信,可设置密码

  • 复制public key中的内容,添加到Github的相应设置中

  • 生成的密钥文件保存在User/[name]/.ssh/文件夹下,id_rsa为私钥用于校验,id_rsa.pub为公钥用于服务端匹配

  • 验证与GitHub的加密通信:ssh -T git@github.com

还可以通过ssh-keygen命令或者PuTTYgen进行密钥配置,原理大致相同。

Git本地仓库与远程仓库交互

  • GitHub创建仓库:参考网页指引,完成后得到远程仓库地址remote_repo,如git@github.com:[account]/[repo].git
  • 克隆远程仓库到本地:git clone remote_repo
  • 本地已有仓库添加远程仓库:git remote add remote_repo
  • 推送本地更新到远程仓库:git push
  • 从远程仓库拉取内容:git fetch
  • 从远程仓库拉取并更新本地内容:git pull(存在丢失本地修改内容的可能)

常见问题

  1. git pullgit fetch的区别,参考:https://blog.csdn.net/weixin_41975655/article/details/82887273
  2. 更多用法参考帮助文档或者官网说明:https://git-scm.com/doc

Windows 10 1809 程序字体显示错误原因

更新到Win10 1809后部分程序字体出现显示错误现象,如AIDA64中中文字符显示:

win10 1809 fonts error.png

错误的原因在于这些程序并未采用Unicode编码,而Win10 1809以UTF-8格式显示这些字符,结果出错。该bug暂时还未修复,可以通过设置让中文显示正常。

在 设置 - 时间和语言 - 语言 - 管理语言设置 中:

语言设置

非 Unicode 程序的语言 设置有个 Beta版的选项:

非Unicode Beta

勾选了该选项后,采用非Unicode的程序会出现字符显示错误的问题,bug来源于此。

取消该选项并将区域设置为中文(简体,中国)后,采用中文编码的程序恢复正常显示。

开发免费托管的静态网站

随着互联网的发展,搭建网站的技术门槛和使用成本都急剧降低。有如下几个痛点得到极大缓解:

  • 代码免费托管:Github已经取消对私有库的数量限制,网站代码可以通过Git推送到Github的库中进行托管;
  • 网站免费托管:购置实体或者虚拟服务器都需要一笔不小的开支,而采用netlify等静态网站托管则不需要任何费用,并且可以链接Github代码库实现即时修改;
  • 域名价格低廉:域名可选则的种类非常丰富,对于一般性的域名购入和使用的成本都非常的低。
  • 开源框架丰富:WordPress, Hexo等开源框架可以实现丰富多样的网站,这些框架的应用降低了网站开发的技术门槛。

下面将讲解免费托管方式下的网站开发所使用的工具和开发流程。

开发工具

  • 阿里云:域名注册与解析设置
  • Node.js:基于Chrome V8的JavaScript运行环境
  • Hexo:静态网站生成器,将Markdown文档转换为静态网页
  • Typora:Markdown文档编辑器,所见即所得
  • Git:代码版本管理与代码部署
  • GitHub:代码托管
  • netlify:静态网站托管

域名注册与解析

在阿里云上以合适的价格购买喜欢的域名,和淘宝没区别。

域名解析设置中注意区分记录类型,如类型A常用于将域名指向自建服务器的IP地址,类型CNAME则是将域名转向另一个域名。本文采用CNAME记录类型。

开发环境

首先安装Git和Node.js开发工具,Windows平台下载安装即可,Linux平台使用yum、apt等包管理工具安装或者下载源码编译安装。

其次安装Hexo,命令为:

1
npm install hexo-cli -g

安装完成后初始化网站编译环境:

1
2
3
hexo init blog
cd blog
npm install

此时编译环境以及搭建完成,可以开启本地服务以查看网站效果:

1
2
npm install hexo-server
hexo server

然后开始进行网站内容的创作。发表新内容的命令为:

1
hexo new [layout] <title>

[layout]值内容所在的页面,采用默认页面则可以省略。<title>为新建内容的标题,执行完该命令后在source目录里会生成<title>.md的文档。

最后,通过Markdown编辑器如Typora对生成的文档进行编辑,完成后执行如下命令生成静态网页:

1
hexo generate

代码托管

网站的源文件可由GitHub的仓库进行托管,将修改并完成编译的网页文件推送至GitHub相应的仓库中。流程大致如下:

  1. GitHub中创建仓库,复制仓库的克隆地址;
  2. 修改网站编译环境根目录下的_config.yml文件中的deploy参数:

    1
    2
    3
    4
    deploy:
    type: git
    repo: https://github.com/[user]/[repo].git
    branch: master
  3. 将生成的静态网站文件部署到GitHub:

    1
    hexo deploy

网站托管

创建netlify账号并关联GitHub账户,按照网站指引添加网站内容,选择网站对应的仓库,完成后发布网站。

需要注意的是,如需使用自己的域名,不仅要在netlify中进行域名的填写,还要在阿里云中对相应的域名进行解析设置。设置方式为采用CNAME类型将自己的域名指向netlify所提供的二级域名。

总结

开发免费托管的静态网站所使用到的工具较多,操作流程略微有些繁琐。不过开发技术门槛并不高,基本上按照这些工具的官方说明文档进行操作即可。过程中所使用到的命令都很简单,甚至没有编程基础也可以操作,唯一需要的是耐心。

采用这种方式部署网站的好处是能够轻松实现网站的迁移,变更托管平台或者域名都不会对网站内容造成影响,比采用WordPress搭建的网站容易很多。

网站搭建好了即可将重心放到丰富内容和美化网站上,慢慢折腾吧^_^

数学符号(Notation)

冯玮(wfeng@zju.edu.cn

定义常用的数学符号含义,以及常用系统的关系式。

标量符号 含义
$a$ 幅度
$b, d, o, q, u, x, y$ 通用
$e$ 指数
$g$ 增益
$l$ 长度
$h$ 高度
$t$ 时间
$p$ 概率
$n$ 离散时间序列
$f$ 频率
$\omega$ 角频率
$r$ 距离
$s$ 符号
$v$ 运动速度
$w$ 权系数
$z$ 深度
$c$ 声速
$\theta$ 到达角
$m$ 模号
$i, j$ 序号
$k$ 载频序号
$\mu$ 均值
$\sigma^2$ 方差
$h(t)$ 信道冲激响应
$\delta (t)$ 脉冲信号
$H(\omega)$ 信道传递函数
${A_m}\left( {r,z} \right)$ 在距离$r$深度$z$处第$m$号模函数的幅度
${\Psi _m}(z)$ 随深度$z$变化的第$m$号模函数
$B$ 带宽
$L$ 似然函数,或序列长度,或片段个数
$W$ 加权系数
$N$ 数量,或阵元个数
$M$ 数量,或模的个数
$\Omega$ 频点个数
$J$ 目标函数
$x (t)$ 发射信号
$y(t)$ 接收信号
$n(t)$或$v(t)$ 噪声信号
$\tau$ 时延
$\rho$ 密度
$\alpha$ 衰减系数
$\eta$ 相关系数
$\mathcal{N} \left( \mu,\sigma^2 \right)$ 均值$\mu$为方差为$\sigma^2$的高斯分布
$\mathcal{CN} \left( 0,\sigma^2 \right)$ 零均值,方差为$\sigma^2$的复高斯分布
$\vec x (r,z)$ $x$的位置为$(r ,z)$
矢量符号 含义
$\bf{x}$ 小写黑体字母表示向量
$\bf{X}$ 大写黑体字母表示矩阵
$\bf{\Sigma}$ 协方差矩阵
$\mathbf{H}$ Channel mixing matrix
$\bf{s}$ 发送的符号向量
$\bf{f}$ 滤波器系数向量
运算符 含义
${( \cdot )^T}$ 转置
${( \cdot )^*}$ 共轭
${( \cdot )^H}$ 共轭转置
$*$ 卷积
$E [\cdot]$ 求期望
$\widetilde{\bf a}$ 归一化
$\hat{a}$ $a$的估计
$\text{tr} ({\bf A})$ 矩阵${\bf A}$的迹
$({\bf A})^\dagger $ 矩阵${\bf A}$的伪逆
$\text{Cov} (X, Y)$ 求两个随机变量的协方差
$\nabla$ 拉普拉斯算子

信道输入输出关系

Time: $y(t) = h(t) * x(t) + v(t)$

Discrete Time: $y_n = \sum_{i=0}^{N-1} h_i x_{n-i} + v_n$

Vector form: $\mathbf{y}_k = \mathbf{H} \mathbf{x}_k + \mathbf{v}_k$

Frequency: $Y=HX+V$

Single frequency: $Y_k=H_k X_k+V_k$

压缩感知(Compressive Sensing)

冯玮(wfeng@zju.edu.cn

引言

一种建立在稀疏特性基础上的新型的采样理论。

研究历史

石光明等综述了CS理论框架及关键技术问题,并着重介绍了信号稀疏变换、观测矩阵设计和重构算法三个方面的最新进展, 评述了其中的公开问题, 对研究中现存的难点问题进行了探讨, 最后介绍了 CS 理论的应用领域 [1]

Candes[2],Romberg,Tao[3]和Donoho[4]等人构造了具体的算法。

研究问题

基础

可压缩信号向量${\bf x}_{M \times 1}$和压缩后信号向量${\mathbf y}_{N \times 1}$具有如下线性关系
$$
\bf{y} = \bf{A} \bf{x},
$$
其中$\bf{A}=\bf{\Psi} \bf{\Phi}$为字典矩阵,包含感知矩阵${\bf \Psi}_{M \times N}$和表示矩阵${\bf\Phi}_{N \times N}$两部分组成,并且$M < N$,${\mathbf y}$实现了对${\mathbf x}$的稀疏表示。若$\bf{A}$满足约束等距条件,则可由观测信号${\mathbf y}$重构源信号${\mathbf x}$。

感知矩阵

如何设计感知矩阵${\bf \Psi}$

稀疏矩阵方程求解

求解稀疏矩阵方程,重构源信号,重构算法可分为三大类[1]

  1. 贪婪追踪算法:匹配追踪(Matching Pursuit, MP)算法,收敛速度快,不是全局最优解。改进算法:正交匹配追踪(OMP)。

  2. 凸松弛法:基追踪(Basis Pursuit, BP)算法,具有全局最优解,计算复杂度高。内点法、梯度投影法。

  3. 组合算法。

感知矩阵与恢复性能关系

感知矩阵与稀疏变换基的不相干特性

感知矩阵列之间的相干性[5]

实际应用

声纳[6]与雷达

图像采集

参考文献


  1. 1.石光明, 刘丹华, 高大化, 刘哲, 林杰, and 王良君, “压缩感知理论及其研究进展,” 电子学报, vol. 37, no. 5, pp. 1070–1081, 2009.
  2. 2.E. J. Candes and M. B. Wakin, “An Introduction To Compressive Sampling,” IEEE Signal Processing Magazine, vol. 25, no. 2, pp. 21–30, Mar. 2008.
  3. 3.E. J. Candes and T. Tao, “Near-Optimal Signal Recovery From Random Projections: Universal Encoding Strategies?,” IEEE Transactions on Information Theory, vol. 52, no. 12, pp. 5406–5425, Dec. 2006.
  4. 4.D. L. Donoho, “Compressed sensing,” IEEE Transactions on Information Theory, vol. 52, no. 4, pp. 1289–1306, Apr. 2006.
  5. 5.Z. Zhang and B. D. Rao, “Extension of SBL Algorithms for the Recovery of Block Sparse Signals With Intra-Block Correlation,” IEEE Trans Signal Process, vol. 61, no. 8, pp. 2009–2015, Apr. 2013.
  6. 6.A. Xenaki, P. Gerstoft, and K. Mosegaard, “Compressive beamforming,” The Journal of the Acoustical Society of America, vol. 136, no. 1, pp. 260–271, Jul. 2014. DOI

压缩感知波束形成(Compressive beamforming)

冯玮(wfeng@zju.edu.cn

引言

由阵列信号做波束形成处理,可以估计信道的到达角度(direction-of-arrival, DOA)。

采用压缩感知方法(compressive sensing, CS)与波束形成相结合,目的在于提高对DOA的分辨能力。压缩感知方法利用的是信号自身的稀疏特性,能够使用少量基本信号的线性组合表示一目标信号,以低于奈奎斯特采样率对信号进行采样。然后通过解凸优化问题从这些较少的采样中恢复或重构原始信号。

压缩感知波束形成方法相比传统方法,具有更高的DOA分辨力。但是该方法的性能还与许多因素相关,比如接收信号的相关性、单个片段或者多个片段信号、接收阵的结构、阵元的间距等。

压缩感知方法

可压缩信号向量${\bf x}_{M \times 1}$和压缩后信号向量${\mathbf y}_{N \times 1}$具有如下线性关系
$$
\bf{y} = \bf{A} \bf{x},
$$
其中$\bf{A}=\bf{\Psi} \bf{\Phi}$为字典矩阵,包含感知矩阵${\bf \Psi}_{M \times N}$和表示矩阵${\bf\Phi}_{N \times N}$两部分组成,并且$M < N$,${\mathbf y}$实现了对${\mathbf x}$的稀疏表示。若$\bf{A}$满足约束等距条件,则可由${\mathbf y}$重构${\mathbf x}$。

Xenaki et al. 在压缩感知的框架下,详细地探讨了DOA估计问题 [1]。文中指出应用压缩感知方法求解欠定问题时依赖两个条件,一是需要精确掌握信号的稀疏性,二是感知基与表示基要足够不相关。其次,该文介绍了压缩感知和凸优化的基本原理,采用 cvx 工具包计算优化目标函数。

Gerstoft et al.研究了针对针对多个测量数据的压缩感知波束形成方法,分别采用了LASSO(least absolute shrinkage and selection operator)[2]和稀疏贝叶斯学习方法(sparse Bayesian learning, SBL)[4]进行DOA估计。针对LASSO方法提出正则化参数$\mu$的选择方式。

DOA估计

Xenaki et al. 将DOA估计常用的方法进行了对比,包括CBF, MVDR, MUSIC和CS方法 [1]

存在的问题

Xenaki et al. 探讨了压缩感知波束形成方法中存在的一些问题 [1]。首先是基失配,例如信号的实际DOA不在DOA感知基的离散点上,那么与DOA稀疏性假设存在矛盾,估计性能会显著下降。其次,感知矩阵的列之间要保证足够的不相关性,通过计算列之间的相关系数或者约束等距性来进行评估。文中评估了角度估计偏差、角度分辨力与列相关性的关联性。最后,该文研究了稀疏性与噪声水平之间的关系,提出了对优化函数进行迭代对角线加载的方式来降噪,并与其他DOA估计方法进行了性能对比。

Xenaki et al. 采用DOA连续的表达形式,引入原子范数来构建优化函数,用于克服基失配问题[3]

参考文献


  1. 1.A. Xenaki, P. Gerstoft, and K. Mosegaard, “Compressive beamforming,” The Journal of the Acoustical Society of America, vol. 136, no. 1, pp. 260–271, Jul. 2014. DOI
  2. 2.P. Gerstoft, A. Xenaki, and C. F. Mecklenbräuker, “Multiple and single snapshot compressive beamforming,” The Journal of the Acoustical Society of America, vol. 138, no. 4, pp. 2003–2014, Oct. 2015. DOI
  3. 3.A. Xenaki and P. Gerstoft, “Grid-free compressive beamforming,” The Journal of the Acoustical Society of America, vol. 137, no. 4, pp. 1923–1935, Apr. 2015. DOI
  4. 4.P. Gerstoft, C. F. Mecklenbräuker, A. Xenaki, and S. Nannuru, “Multisnapshot Sparse Bayesian Learning for DOA,” IEEE Signal Processing Letters, vol. 23, no. 10, pp. 1469–1473, Oct. 2016. DOI

Hexo Math Support

首先测试下当前Hexo对Math的支持情况:
$$ \begin{eqnarray} \nabla\cdot\vec{E} &=& \frac{\rho}{\epsilon_0} \ \nabla\cdot\vec{B} &=& 0 \ \nabla\times\vec{E} &=& -\frac{\partial B}{\partial t} \ \nabla\times\vec{B} &=& \mu_0\left(\vec{J}+\epsilon_0\frac{\partial E}{\partial t} \right) \end{eqnarray} $$

安装MathJax渲染程序

$ npm install hexo-renderer-mathjax --save

修改文件_config.yml,添加内容(貌似不加也行):

plugins:
- hexo-renderer-mathjax

CDN出错

原来的CDN已不再使用,所以需要修改文件\node_modules\hexo-renderer-mathjax\mathjax.html这部分的注入代码。新的通过连接CDN加载MathJax的js代码为:

1
2
3
<script type="text/javascript" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML">
</script>

MarkDown与MathJax渲染冲突

添加MathJax后写几个公式发现渲染出了很多问题,原因是Hexo默认先使用hexo-renderer-marked引擎渲染MarkDown,然后再交给MathJax渲染。hexo-renderer-marked会把一些特殊的markdown符号转换为相应的html标签,比如在markdown语法中,下划线_代表斜体,会被转化为< em>标签,\\也会被转义成一个\。而类Latex格式书写的数学公式下划线_表示角标,\\表示公式换行,有特殊的含义,所以MathJax引擎在渲染数学公式的时候就会出错。
解决方法有人提出更换Hexo的MarkDown渲染引擎,用hexo-renderer-kramed 替换默认的hexo-renderer-marked引擎,但我看了下hexo-renderer-kramed的文档说明,如果用这个引擎的话,要改变我的MarkDown书写习惯,还是不用了,并且换了这个引擎还是没有完全解决问题。
最终解决方法是参考一篇博文中修改hexo-renderer-marked渲染引擎的js脚本,去掉对 _\\ 的转义。Hexo默认的MarkDown渲染引擎hexo-renderer-marked会调用marked模块的marked.js脚本进行最终的解释,这个脚本在Hexo安装后的node_modules\marked\lib\目录中。有两点修改:
针对下划线的问题,取消_作为斜体转义,因为marked.js中*也是斜体的意思,所以取消掉_的转义并不影响使用markdown,我平时一般不用斜体,就是用也更习惯用*作为斜体标记。针对marked.js与Mathjax对于个别字符二次转义的问题,我们只要不让marked.js去转义\\,\{,\}在MathJax中有特殊用途的字符就行了。编辑node_modules\marked\lib\marked.js 脚本,
【第一步】
将451行的

1
escape: /^\\([\\`*{}\[\]()# +\-.!_>])/,

替换为

1
escape: /^\\([`*\[\]()# +\-.!_>])/,

这一步取消了对\\,\{,\}的转义(escape)

【第二步】
将459行的

1
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

替换为

1
em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

这一步取消了对斜体标记_的转义
这样带来一个问题就是,以后每次更换电脑,在新电脑上安装完Hexo环境后,都要手动修改marked.js文件。

该节文字摘自:http://www.mamicode.com/info-detail-2145077.html

WSL display desktop

WSL 显示桌面

总结起来有两种方式在 Windows 上显示 Linux 桌面,Ubuntu和Kali都没问题。

方式一:Windows端运行 Xserver 程序如 VcXsrv,Linux 端设置 DISPLAY=:0.0并运行xfce4-session即可。

方式二:Linux端启动 /etc/init.d/xrdpstart,Windows 端通过远程桌面连接127.0.0.1:3390 即可显示桌面。

Read More