算法学习笔记(46): 离散余弦变换(DCT)
1.算法学习笔记(∞):杂项2.算法学习笔记(1): 欧几里得算法及其扩展3.算法学习笔记(2): 欧拉定理与逆元4.算法学习笔记(3): 倍增5.算法学习笔记(3.1): ST算法6.算法学习笔记(4): 并查集及其优化7.算法学习笔记(5): 最近公共祖先(LCA)8.算法学习笔记(6): 树链剖分9.算法学习笔记(7): 二分图10.算法学习笔记(8): 网络流11.算法学习笔记(8.0): 网络流前置知识12.算法学习笔记(8.1): 网络最大流算法 EK, Dinic, ISAP13.算法学习笔记(8.2): 上下界网络流14.算法学习笔记(8.3): 网络最大流 - 模型篇15.算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)16.算法学习笔记(10): BSGS算法及其扩展算法17.算法学习笔记(11): 原根18.算法学习笔记(12): 线性基19.算法学习笔记(13): Manacher算法20.算法学习笔记(14): 字符串哈希21.算法学习笔记(15): Trie(字典树)22.算法学习笔记(16): 组合数学基础23.算法学习笔记(17): 快速傅里叶变换(FFT)24.算法学习笔记(18): 平衡树(一)25.算法学习笔记(19): 树上启发式合并(DSU on tree)26.算法学习笔记(20): AC自动机27.算法学习笔记(21): 平衡树(二)28.算法学习笔记(22): 逆序对与原序列29.算法学习笔记(23): 马尔可夫链中的期望问题30.算法学习笔记(24): 狄利克雷卷积和莫比乌斯反演31.算法学习笔记(25): 矩阵树定理32.算法学习笔记(26): 计算几何33.算法学习笔记(27): 后缀结构34.算法学习笔记(28): 筛法35.算法学习笔记(29):分块36.算法学习笔记(30):Kruskal 重构树37.算法学习笔记(31): 李超线段树38.算法学习笔记(32): 分治39.算法学习笔记(33): 格路径与计数40.算法学习笔记(34): 矩阵乘法与线段树标记41.算法学习笔记(35): CMD Tree42.算法学习笔记(36): 期望中的停时43.算法学习笔记(37): 点分治,边分治小记44.算法学习笔记(38): 矩阵45.算法学习笔记(39): 2-SAT46.算法学习笔记(40): 具体数学47.算法学习笔记(41): 朴素多项式算法48.算法学习笔记(42): 颜色段均摊49.算法学习笔记(43): 可持久化线段树 - 区间加!50.算法学习笔记(44): 二维问题小计51.算法学习笔记(45): 快速沃尔什变换 FWT
52.算法学习笔记(46): 离散余弦变换(DCT)
前置知识:离散傅里叶变换
傅里叶变换在上文中更多的是 OI 中的理解以及应用。但是傅里叶变换奥秘还很多。
回顾 在傅里叶变换中的定义:,存在 的性质。意味着离散傅里叶变换实际上是周期性的,这也变相的解释了为什么存在循环卷积的性质。
傅里叶级数
我们回顾什么是傅里叶级数。傅里叶断言,对于任何周期信号 都可以表示为成谐波关系的虚指数信号的线性组合,即:
虽然后来证明当 满足狄里赫利条件时才成立……
周期信号 满足存在一个正值 满足:
最小的 称为基波周期, 称为基波频率。
如果我们知道了一个 该如何求 呢?
利用积分:
将后面变形:
注意到:
中,存在:
所以:
DCT 变换与 DFT 的联系
DCT 实际上就是 DFT 的一种特殊形式。
在傅立叶级数的推导中:
是非常有趣的。
这反映出了如果对一个周期为 ,并且周期内是个奇函数的函数 ,结果一定 ,反之不为 。
那么我们考虑将一个一般的周期信号变成一个周期内的偶函数,这样和 这个奇函数相乘后还是奇函数,积分出来也就没了,从而使得 DFT 的虚部没了。
上面所说的连续的情况,但是实际上离散的情况也是一样。
考察 DFT 的式子:
令 ,使得 ,那么其 DFT:
发现并不优美,考虑将幂平移 :
中间是利用 展开推导而来。
发现虚部直接没了,这符合前面得出的结论。
然后我们成功的学会了 DCT。
IDCT
由于 DCT 本质上就是 DFT,所以 IDCT 本质上就是 IDFT。所以理解是简单的了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?