信号相关知识

傅立叶级数

周期为T的周期信号,若满足“狄里赫利”条件,则可以将其展开为有限或无限个离散的正余弦函数累加的形式。它的物理意义是很明显的,这就是把一个比较复杂的周期运动看成许多不同运动的叠加,如下:
$$f(t) = A_{0}+\sum_{n=1}^{\infty }A_{n}sin(n\omega t + \varphi )$$
而对于任何一个非周期信号,同样可以用傅立叶展开的形式,只不过它的频域曲线是连续的(后文有涉及),在计算上也从累加符号变成了积分符号。两者的关系如下:
图片名称
那傅立叶变换的用处是什么?给你一个正弦曲线,让你从中拿走某个频率的分量(即滤波),时域图中基本无法看懂,频域中只要拿走几条竖线就好了。而在反向传播算法中,FFT可以把微分、积分,在频域中变为加减乘除的简单运算。

时域&频域

时域反应的是现实世界中我们最能感知的信号,横轴为时间,纵轴为振幅;而频域反应的是频率与振幅的关系。将一个表示波的函数从时域转化为频域的关系,便称为傅立叶变换。两个例子如下所示:
图片名称

PS:玄学傅立叶:

我们看似不规律的事情反而是规律的正弦波在时域上的投影,而正弦波又是一个旋转的圆在直线上的投影。
我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的。在最外面的小齿轮上有一个小人——那就是我们自己。我们只看到这个小人毫无规律的在幕布前表演,却无法预测他下一步会去哪。而幕布后面的齿轮却永远一直那样不停的旋转,永不停歇。

如何用一幅图总结频域、时域、相位谱的关系(引自知乎)
图片名称

采样

以音频文件采样为例:同图像bmp文件一样,pcm文件保存的是未压缩的音频信息。
16bits 编码是指,每次采样的音频信息用2个字节保存。可以对比下bmp文件用分别用2个字节保存RGB颜色的信息。
16000采样率 是指 1秒钟采样 16000次。当前声卡常用的采样频率一般为44.1KHz,即一秒采样44100次,人耳最敏感的听力范围20Hz到8000Hz。显然采样频率越高声音的还原就越真实越自然。
即:1秒的16000采样率音频文件大小是 $2\times16000 = 32000$字节 ,约为32K
采样定理:衡量的是采样频率与信号频率之间的关系。采样定理规定,采样频率必须大于等于信号频率的两倍,才能够将原始信号从采样定理中完全恢复出来,否则会造成频率曲线混叠

图像大小变换

图像像素数量 = 图像分辨率相乘,例如:图像分辨率为$1280\times720$,那么这张图片像素有100万。在同一台设备上,图片分辨率越高,这张图片1:1放大时,图片面积越大;图片分辨率越低,这张图片1:1缩放时,图片面积越小。
所以,将$1280 \times720 $的图像缩小到$720 \times 540$时,便需要采用下采样(如果采用简单的丢弃或者最近邻插值,将会导致图像较大程度地失真,推荐参考双线性插值算法),这样再在同一台设备上,处理后的图片size就比较小。python代码如下:

1
2
3
4
5
6
7
8
9
from PIL import Image
import numpy
filename = "/Users/wxj/Desktop/WechatIMG2.jpeg"
img = Image.open(filename)
image = np.array(img) # PIL 图像转 numpy
imgSize = img.size #图片的长和宽
print (imgSize) # 1920*1080
out = img.resize((1080640),Image.ANTIALIAS) #降低分辨率
out.save("1.jpg")

图像尺寸怎么计算呢?

pic_size = 分辨率$\times$3字节(rgb)图像,但这样发现跟电脑中显示的大小不同,因为图像文件(.jpg、png)等,都是有损压缩,一般会压缩几十到几百倍不等这样子。

图像金字塔

图像金字塔算法是对图像的下采样、上采样:

  • 其中下采样为采用高斯内核卷积;之后去除偶数行列
  • 上采样为将图像在每个方向扩大为原来的两倍,新增的行和列以0填充;再使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值
    而resize函数改变大小与图像金字塔的不同,采用的是线性插值补全丢失的像素,但实际用下来差别不大。

 
插个话:图像金字塔在目标检测中的应用
滑窗的尺寸一般是固定的,而多尺度通过图像金字塔实现。这样相比不断改变滑窗大小,效率更高。至于缩小多少倍,源图缩到滑动窗口大小即可以,这样代表整张图片是某个类。

假如人脸size[20,20],滑动窗口(box)Size[40,40]那么可能检不出这张人脸(人脸占据比例太小),而随着图像金字塔变换人脸size会越来越小,那人脸占据整个box的比例也会更低,导致无法检出。
换句话说:MinFaceSize(40),只能检测最小约为[40,40]的人脸。

算法时间复杂度相关

1、归并排序,分而治之,O(NlogN)
图片名称

2、二叉搜索树,左子树<根节点<右子树,O(logN)

3、B+树
查找一个特定值这个树挺好用,但是当你需要查找两个值之间的多个元素时,就会有大麻烦了。你的成本将是 O(N)。例如:查找B、C之间的值,需要中序遍历后(DBEAFC)再进行筛选。
这就需要用到B+tree:搜索复杂度还是在 O(log(N))(只多了一层);另外,最底层的节点是跟后续节点相连接的
图片名称

4、哈希表
哈希表这种数据结构可以用关键字来快速找到一个元素。为了构建一个哈希表,你需要定义下面两个参数:

  • 关键字的哈希函数。关键字计算出来的哈希值给出了元素的位置(叫做哈希桶)(哈希函数设计极大影响算法复杂度)
  • 关键字比较函数。一旦你找到正确的哈希桶,你必须用比较函数在桶内找到你要的元素。

Ref:

傅里叶分析之掐死教程(完整版)更新于2014.06.06