离散傅里叶变换DFT、离散余弦变换DCT、离散正弦变换DST,原理与公式推导

本文深入探讨了视频编解码算法中使用的离散余弦变换(DCT)和离散正弦变换(DST),重点介绍了DCT-II、DCT-VIII及DST-VII在H.266标准中的应用,分析了这些变换如何通过空域/频域转换实现视频压缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新:本网页为纯图片版,是由 Word 文档转图片后直接上传的。目前我已更新一个 Markdown 文字版的,网页浏览体验会好一些。因为一篇博客的字符数量有限制,所以分开了三篇。

目前主流视频编解码算法都要使用到离散余弦变换(Discrete Cosine Transform)以及离散正弦变换(Discrete Sine Transform)对预测残差进行空域/频域的转换,通过牺牲部分高频的信息来达到压缩的目的。总的来说,DCT和DST都各自有八种形式,网上主要的资料都是介绍DCT-II,也就是第二类DCT,至于其他类型的资料少之又少,更不用说关于DST的介绍。过去,DCT-II由于其自身确实具有的优越性,在早期的编解码算法如H.264中大量使用,但后来人们发现其他的DCT和DST在某些情况下表现或许更加出色,例如,最新的H.266标准也将DCT-VIII以及DST-VII加入到了候选变换类型中。因此,为了弄懂H.266为什么要使用这三种变换类型,我们有必要对DCT和DST的原理做深入的理解。

很多人可能并不清楚DCT和DST从何而来,也不知道为什么它们两者为什么会有那么多种形式。实际上,DCT和DST的推导完完全全来自于离散傅里叶变换(Discrete Fourier Transform),他们两者本质上是DFT的特殊形式,因此,如果弄懂了DFT,DCT和DST也就自然理解了。所以,文章开始着重分析了DFT的一些性质,实际上是为后面做必要的铺垫。不过,要弄懂DFT,还要从傅里叶级数以及傅里叶变换说起,但由于篇幅限制,这里就不说了,大家可以找一些信号与系统的书籍资料学习一下,其实文章的内容大部分在那本绿皮的《数字信号处理》里面都有。因为这个文档我是写在Word里的,要转成Markdown不太方便,所以就直接转成图片了,后面篇幅比较长,但其实弄懂了前面的DFT后面的都只是一些重复性的工作而已。公式较多,内容较广,所以有些文字上的错误或者理解上的偏差在所难免。

离散傅里叶变换

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

离散余弦变换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

离散正弦变换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

附录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### 短时离散余弦变换的概念 短时离散余弦变换(Short-Time Discrete Cosine Transform, STDCT)是一种用于处理非平稳信号的技术。STDCT通过将信号分割成多个较短的时间片段,在这些局部时间窗口上应用离散余弦变换(DCT),从而能够捕捉到信号随时间变化的频域特性。 #### 原理 为了有效地分析瞬态特征明显的音频或其他类型的动态过程数据,通常会采用加窗的方法来减少吉布斯现象的影响并提高分辨率。具体来说: - **分帧**:原始连续输入序列被划分为重叠或者不重叠的小段; - **加权窗口函数**:每一段乘以一个合适的权重因子形成新的有限长度子序列; - **DCT转换**:对每一个这样的子集执行标准形式下的离散余弦变换操作得到其对应的频谱系数; 这种方法允许我们观察不同时间段内的频率组成情况,并且由于采用了类似于傅里叶级数展开的方式,因此可以很好地保留原有信息的同时实现压缩编码等功能[^1]。 ```python import numpy as np from scipy.fft import dct def short_time_dct(signal, window_size=256, hop_length=None): """ 计算给定信号的短时离散余弦变换 参数: signal (array_like): 输入的一维实数值数组表示要处理的信号. window_size (int): 单个时间片中的样本数量,默认为256. hop_length (int or None): 时间步进大小,即相邻两个时间片之间的距离, 如果设置为None,则默认等于window_size//2. 返回: ndarray: 形状为(n_frames, n_freq_bins)的结果矩阵, 表示各个时刻下对应于各频率成分的能量分布. """ if hop_length is None: hop_length = window_size // 2 frames = [] start = 0 while start + window_size <= len(signal): frame = signal[start:start+window_size] frames.append(dct(frame)) start += hop_length return np.array(frames).T ``` #### 应用场景 在实际工程实践中,STDCT广泛应用于语音识别、图像视频压缩等领域之中。例如,在MPEG系列标准中就利用了类似的机制来进行高效的数据存储传输优化工作。此外,对于某些特定模式匹配任务而言,它同样提供了强有力的支持工具之一。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值