Discrete Cosine Transform
离散余弦变换
由于实信号傅立叶变换的共轭对称性,导致DFT后在频域中有一半的数据冗余。离散余弦变换(DCT)在处理实信号时比离散傅立叶(DFT)变换更具优势。在处理声音信号这类实信号时,DFT得到的结果是复功率谱,其结果中的一半数据是没利用价值的。相比之下,DCT得到的结果是实谱,从而节省了不必要的运算。
一个序列的DFT就是将其周期拓展后取其DFS系数的一个周期。如果序列的开始及结尾处的幅值差异较大,那么这个周期拓展的序列便会有较多的高频分量。
而序列的DCT(实序列)相当于一个长度是它两倍的实偶序列的DFT(普通序列的DFT=实序列+虚序列),在储存同样个数的数据的情况下,DCT的能量更集中在低频。
DCT还有一个很重要的性质(能量集中特性):大多书自然信号(声音、图像)的能量都集中在离散余弦变换后的低频部分,因而DCT在(声音、图像)数据压缩中得到了广泛的使用。由于DCT是从DFT推导出来的另一种变换,因此许多DFT的属性在DCT中仍然是保留下来的。(归一化之后,会在高频产生很多0系数,说明DCT比FFT变换具有更好的能量聚集度。)
DCT在图像处理中优于DFT的性质是更高的能量聚集度,根本原因是二维DCT和二维DFT变换空间的基底不同。二维DFT的变换空间基底(谐平面波分量)是由sin和cos平面波共同构成的。而二维DCT的变换空间基底(谐平面波分量)是由cos单独构成的。
图像经过二维DFT变换后,大部分能量集中在频谱空间的四个角落(低频分量);而图像经过二维DCT变换后,大部分能量集中在频谱空间的左上角(低频分量)。此所谓DCT的能量集中度优于DFT者也。
DCT的几条特点,即:实数变换、确定的变换矩阵、准最佳变换性能外,二维DCT还是一种可分离的变换,可以用两次一维变换得到二维变换结果。
推导
推导N点长实序列的DCT,首先来定义一个新的长度为2N的序列:
DCT可看作是将周期为N的序列x[m]做一个周期延拓成一个周期为2N的序列。如下图。
再来看第一张图是关于 x = -1/2 对称的,要让其关于x = 0对称需要将其向右平移1/2个单位,得到 x’[m] = x’[m – 1/2] 就是关于 x = 0对称的周期序列了(如第二张图)。
上述 2N 点的偶对称序列的 DFT计算过程为:
其中是偶对称的,
分别是偶数和奇数。将
替换为
,可以得到DCT为:
系数定义为c[n, m] ,则
有DCT系数矩阵C∈RN×N,上述为C的第n行第m列的元素。又因为在n=2N的周期内,X[n]=X[-n]是偶对称的。进一步有:
则n从N,...,2N-1的期间,X[n]是多余的,can be dropped。则n的范围变为0,...,N-1。除了第一个n=0,C的所有行向量都是正交归一化的:
为了使得DCT是正交变换,定义系数:
其中c[n, m]被a[n]修正。余弦变换矩阵为:
其中
是DCT变换矩阵C的第i行。
上述行向量都是正交的:,则变换矩阵C也是正交的:
,且
。
则DCT变换可以表示为矩阵形式:,两边左乘C得到:
逆DCT有:,也可以表示为:
参考:http://fourier.eng.hmc.edu/e161/lectures/dct/node1.html
去相关性
在图像处理中,通常来说,正交变换具有去相关性。其中最理想的是KLT,DCT是KLT最大程度上的近似,在视频图像处理中被广泛应用。
从数学的角度上来看,去相关性就是把原取样点的自相关矩阵通过DCT变换,变成一个对角矩阵,而且对角线上的值是取样点自相关矩阵的特征值。这样一来,去相关后的矩阵保留了原矩阵的重要信息(特征值),而过滤到了一些不相关的量。这对后续的处理(比如量化、编码)都非常有意义,它使得矩阵变“瘦”,而关键信息不变,这样一来算是对原关键信息的一种增强,提高了后续的图像还原质量。
而且当信号具有接近马尔科夫过程(Markov processes)的统计特性时,离散余弦变换的去相关性接近于K-L变换(Karhunen-Loève 变换--它具有最优的去相关性)的性能。
通过研究发现,DCT除了具有一般的正交变换性质外,其变换阵的基向量很近似于Toeplitz矩阵的特征向量,后者体现了人类的语言、图像信号的相关特性。因此,在对语音、图像信号变换的确定的变换矩阵正交变换中,DCT变换被认为是一种准最佳变换。在近年颁布的一系列视频压缩编码的国际标准建议中,都把 DCT 作为其中的一个基本处理模块。
计算复杂度
尽管直接使用公式进行变换需要进行O(n2)次操作,但是和快速傅里叶变换类似,有复杂度为O(nlog(n))的快速算法,这就是常常被称做蝶形变换的一种分解算法。另外一种方法是通过快速傅里叶变换来计算DCT,这时候需要O(n)的预操作和后操作。
二维DCT
离散余弦变换(DCT)公式:
逆离散余弦变化(IDCT)公式:
总结
与 DFT 相比,DCT 有两个主要优点:
- 它是一种比 DFT 具有更好的计算效率的实变换,DFT的定义是一个复变换。
- 它不引入间断,同时在时域信号中施加周期性。在 DFT 中,当时间信号被截断并假定为周期性时,在时域中引入了不连续性,并引入了相应的频域操作。但是,当截断时域信号时,即使假设对称性,也不会在 DCT 中引入不连续性和相关操作。
扩展
离散时间傅里叶变换(DTFT,Discrete Time Fourier Transform)使我们能够在频域(数字频域)分析离散时间信号的频谱和离散系统的频响特性。但还存在两个实际问题。
1.数字频率是一个模拟量,为了便于今后用数字的方法进行分析和处理,仅仅在时域将时间变量t离散化还不够,还必须在频域将数字频率离散化。
2.实际的序列大多为无限长的,为了分析和处理的方便,必须把无限长序列截断或分段,化作有限长序列来处理。
FT, LT, ZT
傅立叶变换的FT物理意义是将一个在时间域当中的信号所包含的所有频率分量(主要指其各频率分量的幅度和相位)用一个以角频率为自变量的函数表示出来,称其频谱。傅里叶分析包含傅里叶级数与傅里叶变换。傅里叶级数用于对周期信号转换,傅里叶变换用于对非周期信号转换。
FT是傅立叶变换,它主要用于分析连续非周期信号,由于信号是非周期的,它必包含了各种频率的信号,所以具有时域连续非周期对应频域连续非周期的特点。
但是对于不收敛信号,傅里叶变换无能为力,只能借助拉普拉斯变换。(主要用于计算微分方程)
而z变换则可以算作离散的拉普拉斯变换。(主要用于计算差分方程)
从复平面来说,傅里叶分析直注意虚数部分,拉普拉斯变换则关注全部复平面,而z变换则是将拉普拉斯的复平面投影到z平面,将虚轴变为一个圆环。
fourier变换是将连续的时间域信号转变到频率域;它可以说是laplace变换的特例,laplace变换是fourier变换的推广,存在条件比fourier变换要宽,是将连续的时间域信号变换到复频率域(整个复平面,而fourier变换此时可看成仅在jΩ轴);z变换则是连续信号经过理想采样之后的离散信号的laplace变换,再令z=e^sT时的变换结果(T为采样周期),所对应的域为数字复频率域,此时数字频率ω=ΩT。 ——参考郑君里的《信号与系统》。
离散傅里叶变换
DFT公式:
拉普拉斯变换
拉普拉斯变换是工程数学中常用的一种积分变换,又名拉氏变换。拉氏变换是一个线性变换,可将一个有参数实数t(t≥ 0)的函数转换为一个参数为复数s的函数。
拉普拉斯变换解决了不满足绝对可积条件的连续信号,变换到频率域的问题,同时也对“频率”的定义进行了扩充。
所以拉普拉斯变换与连续时间傅里叶变换的关系是:
拉普拉斯变换将频率从实数推广为复数,因而傅里叶变换变成了拉普拉斯变换的一个特例。
当s为纯虚数时,x(t)的拉普拉斯变换,即为x(t)的傅里叶变换(当s=jw时,拉普拉斯变换便等于傅立叶变换)。
大家都认可傅立叶变换的本质是一个信号可以表示成正弦信号的叠加,即无法进行傅立叶变换。在拉普拉斯变换的收敛域内有无数条纵轴,在每一条纵轴上都可以写成一个不等幅正弦信号的叠加。
从这个角度来看,傅立叶变换只不过是s=0纵轴上,信号分解成等幅(特别强调这个等幅概念)正弦信号的叠加。
拉普拉斯变换的本质就是矩阵对角化,因为复指数信号是线性系统的特征向量。详情可看《神奇的矩阵第二季》爱上积分变换部分。
z变换
Z变换解决了不满足绝对可和条件的离散信号,变换到频率域的问题,同时也同样对“频率”的定义进行了扩充。
所以Z变换与离散时间傅里叶变换(DTFT)的关系是:
- Z变换将频率从实数推广为复数,因而DTFT变成了Z变换的一个特例。
- 当z的模为1时,x[n]的Z变换即为x[n]的DTFT。
FFT
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。
假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。 而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点 N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被 N-1个点平均分成N等份,每个点的频率依次增加。
Fn所能分辨到频率为 Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。
假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。
Discrete Cosine Transform的更多相关文章
- Discrete cosine transform(离散余弦转换)
A discrete cosine transform (DCT) expresses a finite sequence of data points in terms of a sum of co ...
- 从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform)
从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform) 一. 傅里叶级数(FS) 首先从最直观的开始,我们有一个信号\(x(t)\)(满足 ...
- H.264 Transform
变换是视频.图像编码的核心部分.目前所采用的变换算法都是从傅里叶变换演变而来.单纯的变换并不会导致视频(图像)的码率变小,反而会增大.但是非常巧妙的一点是:变换把图像从空域转换成的时域,把由色块组成的 ...
- EAC3 Adaptive Hybrid Transform (AHT)
adaptive hybrid transform 由两个linear transforms级联组成. 第一个transform为MDCT,MDCT使用KBD window产生256个transfor ...
- Spark2 ML 学习札记
摘要: 1.pipeline 模式 1.1相关概念 1.2代码示例 2.特征提取,转换以及特征选择 2.1特征提取 2.2特征转换 2.3特征选择 3.模型选择与参数选择 3.1 交叉验证 3.2 训 ...
- WebP 原理和 Android 支持现状介绍(转)
本文为腾讯Bugly开发者社区 投稿,作者:soonlai,版权归原作者所有,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/582939577ef9c5b70855 ...
- 【腾讯Bugly干货分享】WebP原理和Android支持现状介绍
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/582939577ef9c5b708556b0d 1.背景 目前网络中图片仍然是占 ...
- a* products
Experience of black-box testing on set-top-boxes/IP-connected devices, games consoles and tablets ht ...
- <<Numerical Analysis>>笔记
2ed, by Timothy Sauer DEFINITION 1.3A solution is correct within p decimal places if the error is l ...
随机推荐
- 【LEETCODE】73、根据身高重建队列 第406题
说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来 package y2019.Algorithm.greedy.medium; import java.util.Arra ...
- docker 命令(我使用过的)
是否安装docker: docker version 启动docker: service docker start 查看本机可用镜像: docker images 删除镜像: doc ...
- 【题解】Luogu P5294 [HNOI2019]序列
原题传送门 题意:给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小平方和 ...
- 爬虫多次爬取时候cookie的存储用于登入
一.用requests模块自动保存(保存缓存中) 构建一个session对象session = requests.session() 用构建的session代替requests进行访问他就会自动存啦 ...
- Kubernetes Storage Persistent Volumes
链接:https://kubernetes.io/docs/concepts/storage/persistent-volumes/ 支持的参数,比如mountOptions在这里可以找到 删除正在被 ...
- js实现输入密码之延迟星号和点击按钮显示或隐藏
缘由 手机打开segmentfalut时,长时间不登陆了,提示要重新登陆,输入的过程中看到输入密码时,延迟后再变成密文,很好奇,所以捣鼓了一下.本文实现了两种密码展示 代码实现 1 先明后密 js实现 ...
- scrapy 爬虫中间件 deepth深度
源码 class DepthMiddleware(object): def __init__(self, maxdepth, stats, verbose_stats=False, prio=1): ...
- go调度: 第一部分-OS调度(操作系统调度)
开场白 这个是三篇博客中的第一篇, 用来提供go调度背后的机制和语法. 这篇博客主要关注操作系统调度. 三篇博客的顺序是: 1) go调度: 第一部分 - 操作系统调度 2) go调度: 第二部分 - ...
- Replication Controller 和 Replica Set
使用Replication Controller . Replica Set管理Pod Replication Controller (RC) 简写为RC,可以使用rc作为kubectl工具的快速管理 ...
- Vue命名规范
views 命名 views 文件夹下面是由 以页面为单位的vue文件 或者 模块文件夹 组成的,放在 src 目录之下,与 components.assets 同级. views 下的文件夹命名 v ...