前置知识:离散傅里叶变换

傅里叶变换在上文中更多的是 OI 中的理解以及应用。但是傅里叶变换奥秘还很多。

回顾 \(\omega_n\) 在傅里叶变换中的定义:\(e^{i \frac {2\pi} n}\),存在 \(\omega_n^n = 1\) 的性质。意味着离散傅里叶变换实际上是周期性的,这也变相的解释了为什么存在循环卷积的性质。

傅里叶级数

我们回顾什么是傅里叶级数。傅里叶断言,对于任何周期信号 \(x(t)\) 都可以表示为成谐波关系的虚指数信号的线性组合,即:

\[x(t) = \sum_{k = - \infty}^{\infty} a_k e^{jk \omega_0 t}
\]

虽然后来证明当 \(x(t)\) 满足狄里赫利条件时才成立……

周期信号 \(x(t)\) 满足存在一个正值 \(T\) 满足:

\[\forall t, x(t) = x(t + T)
\]

最小的 \(T\) 称为基波周期,\(w_0 = \frac {2\pi} T\) 称为基波频率。

如果我们知道了一个 \(x(t)\) 该如何求 \(a_k\) 呢?

利用积分:

\[\int_0^T x(t) e^{-jn \omega_0 t} dt = \int_0^T \sum_{k = - \infty}^{\infty} a_k e^{jk\omega_0 t} e^{-jn \omega_0 t} dt
\]

将后面变形:

\[\int_0^T \sum_{k = - \infty}^{\infty} a_k e^{jk\omega_0 t} e^{-jn \omega_0 t} dt = \sum_k a_k \left[ \int_0^T e^{j(k - n)\omega_0 t} dt \right]
\]

注意到:

\[\int_0^T e^{j(k - n)\omega_0 t} dt = \int_0^T \cos[(k - n)\omega_0 t] dt + i \int_0^T \sin[(k - n) \omega_0 t] dt
\]

中,存在:

\[\int_0^T \sin[(k - n) \omega_0 t] dt = \begin{cases}
T & k = n \\
0 & k \ne n
\end{cases}
\]

所以:

\[a_k = \frac 1 T \int_0^T x(t) e^{-jk\omega_0 t} dt
\]

DCT 变换与 DFT 的联系

DCT 实际上就是 DFT 的一种特殊形式。

在傅立叶级数的推导中:

\[\int_0^T \sin[(k - n) \omega_0 t] dt = \begin{cases}
T & k = n \\
0 & k \ne n
\end{cases}
\]

是非常有趣的。

这反映出了如果对一个周期为 \(T\),并且周期内是个奇函数的函数 \(\int_0^T\),结果一定 \(= 0\),反之不为 \(0\)。

那么我们考虑将一个一般的周期信号变成一个周期内的偶函数,这样和 \(\sin\) 这个奇函数相乘后还是奇函数,积分出来也就没了,从而使得 DFT 的虚部没了。

上面所说的连续的情况,但是实际上离散的情况也是一样。

考察 DFT 的式子:

\[b_k = \sum_{i = 0}^{n - 1} \omega_n^{ik}a_i
\]

令 \(m = 2n\),使得 \(a_k = a_{m - k - 1}\),那么其 DFT:

\[b_k = \sum_{i = 0}^{m - 1} \omega_m^{ik} a_i = \sum_{i = 0}^{n - 1} a_i \left(\omega^{ik} + \omega^{(2n-k-1)k}\right)
\]

发现并不优美,考虑将幂平移 \(\frac k 2\):

\[\begin{aligned}
b_k &= \sum_{i = 0}^{m - 1} a_i \omega^{ki + \frac k 2} \\
&= \sum_{i = 0}^{n - 1} a_i \left[ \left(\cos \frac {\pi k (i + \frac 12)} n + \cos \frac {- \pi k (i + \frac 12)} n \right) + i\left(\sin \frac {\pi k (i + \frac 12)} n + \sin \frac {- \pi k (i + \frac 12)} n \right) \right] \\
&= 2 \sum_{i = 0}^{n - 1} a_i \cos \frac {\pi k(i + \frac 12)} n
\end{aligned}
\]

中间是利用 \(e^{ix} = \cos x + i \sin x\) 展开推导而来。

发现虚部直接没了,这符合前面得出的结论。

然后我们成功的学会了 DCT。

IDCT

由于 DCT 本质上就是 DFT,所以 IDCT 本质上就是 IDFT。所以理解是简单的了。

算法学习笔记(46): 离散余弦变换(DCT)的更多相关文章

  1. 算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)

    扩展中国剩余定理 讲解扩展之前,我们先叙述一下普通的中国剩余定理 中国剩余定理 中国剩余定理通过一种非常精巧的构造求出了一个可行解 但是毕竟是构造,所以相对较复杂 \[\begin{cases} x ...

  2. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  3. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  4. Johnson算法学习笔记

    \(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...

  5. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...

  6. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  7. 算法学习笔记(5): 最近公共祖先(LCA)

    最近公共祖先(LCA) 目录 最近公共祖先(LCA) 定义 求法 方法一:树上倍增 朴素算法 复杂度分析 方法二:dfs序与ST表 初始化与查询 复杂度分析 方法三:树链剖分 DFS序 性质 重链 重 ...

  8. 算法学习笔记(3): 倍增与ST算法

    倍增 目录 倍增 查找 洛谷P2249 重点 变式练习 快速幂 ST表 扩展 - 运算 扩展 - 区间 变式答案 倍增,字面意思即"成倍增长" 他与二分十分类似,都是基于" ...

  9. Miller-Rabin 与 Pollard-Rho 算法学习笔记

    前言 Miller-Rabin 算法用于判断一个数 \(p\) 是否是质数,若选定 \(w\) 个数进行判断,那么正确率约是 \(1-\frac{1}{4^w}\) ,时间复杂度为 \(O(\log ...

  10. 算法学习笔记(20): AC自动机

    AC自动机 前置知识: 字典树:可以参考我的另一篇文章 算法学习笔记(15): Trie(字典树) KMP:可以参考 KMP - Ricky2007,但是不理解KMP算法并不会对这个算法的理解产生影响 ...

随机推荐

  1. 修改中文、英文参考文献在文末列表中的顺序:EndNote

      本文介绍在EndNote软件中,使得参考文献按照语种排列,中文在前.英文在后的方法.   前期我们在EndNote参考文献格式Output Styles界面介绍一文中,详细介绍了文献管理软件End ...

  2. 关于console.log中this指向的问题

  3. 力扣171(java)-Excel表列序号(简单)

    题目: 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称.返回 该列名称对应的列序号 . 例如: A -> 1B -> 2C -> 3...Z -> ...

  4. 技术解读:现代化工具链在大规模 C++ 项目中的运用 | 龙蜥技术

    简介: 本文详细介绍我们在实际工作中的大型 C++ 项目中现代化工具链的实践以及结果. 编者按:C++ 语言与编译器一直都在持续演进,出现了许多令人振奋的新特性,同时还有许多新特性在孵化阶.除此之外, ...

  5. 一位 sealer maintainer 的心路历程

    简介: 本文作者将回顾个人参与 sealer 开源项目的机缘巧合,参与过程中的挑战,以及从中获取的所悟所感,写下一段文字进行分享,希望对开源新人有所帮助,能够激励想参与开源工作但还未踏出第一步的同学. ...

  6. 【ESSD技术解读-01】 云原生时代,阿里云块存储 ESSD 快照服务如何被企业级数据保护所集成?

    ​简介: 本文描述了阿里云块存储快照服务基于高性能 ESSD 云盘提升快照服务性能,提供轻量.实时的用户体验及揭秘背后的技术原理.依据行业发展及云上数据保护场景,为企业用户及备份厂商提供基于快照高级特 ...

  7. 如何将一棵LSM-Tree塞进NVM

    ​简介: 随着非易失内存产品的商业化推广,我们对于其在云原生数据库中大规模推广的潜力越来越有兴趣.X-Engine是阿里云数据库产品事业部PolarDB新型存储引擎团队研发的一个LSM-tree存储引 ...

  8. [PHP] Laravel-admin 模型表格-列的显示-链接: 关联关系的跳转链接

    link 将字段显示为一个链接. // link方法不传参数时,链接的`href`和`text`都是当前列的值 $grid->column('homepage')->link(); // ...

  9. [Caddy2] Caddyfile 指令

    以下是 Caddyfile 的标准指令. acme_server An embedded ACME server basicauth Enforces HTTP Basic Authenticatio ...

  10. 3种方式自动化控制APP

    自动化控制APP不管是在工作还是生活方面,都可以帮助我们高效地完成任务,节省时间和精力.本文主要介绍自动化控制APP的3种常用方式. 1.Python + adb 这种方式需要对Android有一些基 ...