python离散余弦变换(DCT)

文章目录

变换类型

离散余弦变换(DCT)相当于是傅里叶变换的实部,在scipy.fft中提供了dct函数及其逆变换idct。以dct为例,其函数定义如下,其中type表示余弦变换的类别,norm表示归一化模式。

dct(x, type=2, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, orthogonalize=None)

dct支持4种类型的余弦变换,下面列举出type分别为1,2,3,4时,且norm选用不同参数时,对应的DCT的具体形式。

  • type=1

y [ k ] = x 0 + ( − 1 ) k x N − 1 + 2 ∑ n = 1 N − 2 x [ n ] cos ⁡ ( π n k N − 1 ) , 0 ⩽ k < N y[k]=x_0+(-1)^kx_{N-1}+2\sum^{N-2}_{n=1}x[n]\cos(\frac{\pi nk}{N-1}), 0\leqslant k<N y[k]=x0+(1)kxN1+2n=1N2x[n]cos(N1πnk),0k<N

  • type=2

若norm=None,则

y [ k ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π ( 2 n + 1 ) k 2 N ) , 0 ⩽ k < N y[k]=2\sum^{N-1}_{n=0}x[n]\cos(\frac{\pi(2n+1)k}{2N}), 0\leqslant k<N y[k]=2n=0N1x[n]cos(2Nπ(2n+1)k),0k<N

当norm='ortho’时,表示采用正交DCT,此时 y [ k ] y[k] y[k]需要乘以一个尺度因子 f f f

f = { 1 / ( 4 N ) , i f k = 0 1 / ( 2 N ) , o t h e r w i s e f=\left\{\begin{aligned} &\sqrt{1/(4N)}, if k=0\\ &\sqrt{1/(2N)}, otherwise \end{aligned}\right. f={1/(4N) ,ifk=01/(2N) ,otherwise

此时,DCT的基函数 ϕ k [ n ] = 2 f cos ⁡ π ( 2 n + 1 ) k 2 N \phi_k[n]=2f\cos\frac{\pi(2n+1)k}{2N} ϕk[n]=2fcos2Nπ(2n+1)k将彼此正交

∑ n = 0 N − 1 ψ k [ n ] ψ l [ n ] = δ l k \sum^{N-1}_{n=0}\psi_k[n]\psi_l[n]=\delta_{lk} n=0N1ψk[n]ψl[n]=δlk

  • type=3

当norm=None时

y [ k ] = x 0 + 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π n ( 2 k + 1 ) 2 N ) , 0 ⩽ k < N y[k]=x_0+2\sum^{N-1}_{n=0}x[n]\cos(\frac{\pi n(2k+1)}{2N}), 0\leqslant k<N y[k]=x0+2n=0N1x[n]cos(2Nπn(2k+1)),0k<N

否则,若norm=‘ortho’,则

y [ k ] = x 0 N + 2 N ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π n ( 2 k + 1 ) 2 N ) , 0 ⩽ k < N y[k]=\frac{x_0}{\sqrt{N}}+\frac{2}{\sqrt{N}}\sum^{N-1}_{n=0}x[n]\cos(\frac{\pi n(2k+1)}{2N}), 0\leqslant k<N y[k]=N x0+N 2n=0N1x[n]cos(2Nπn(2k+1)),0k<N

  • type=4

当norm=None时,

y [ k ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π ( 2 n + 1 ) ( 2 k + 1 ) 4 N ) , 0 ⩽ k < N y[k]=2\sum^{N-1}_{n=0}x[n]\cos(\frac{\pi (2n+1)(2k+1)}{4N}), 0\leqslant k<N y[k]=2n=0N1x[n]cos(4Nπ(2n+1)(2k+1)),0k<N

若norm=‘ortho’,则

y [ k ] = 2 N ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π ( 2 n + 1 ) ( 2 k + 1 ) 4 N ) , 0 ⩽ k < N y[k]=\sqrt{\frac{2}{N}}\sum^{N-1}_{n=0}x[n]\cos(\frac{\pi (2n+1)(2k+1)}{4N}), 0\leqslant k<N y[k]=N2 n=0N1x[n]cos(4Nπ(2n+1)(2k+1)),0k<N

示例

示例如下

from scipy.fft import dct, idct
import matplotlib.pyplot as plt
N = 100
t = np.linspace(0,20,N, endpoint=False)
x = np.exp(-t/3)*np.cos(2*t)
y = dct(x, norm='ortho')

window = np.zeros(N)
window[:20] = 1
yr = idct(y*window, norm='ortho')
sum(abs(x-yr)**2) / sum(abs(x)**2)  # 0.0009872817275276098
plt.plot(t, x, '-bx')
plt.plot(t, yr, 'ro')
window = np.zeros(N)
window[:15] = 1
yr = idct(y*window, norm='ortho')
sum(abs(x-yr)**2) / sum(abs(x)**2)  #0.06196643004256714
plt.plot(t, yr, 'g+')
plt.legend(['x', '$x_{20}$', '$x_{15}$'])
plt.grid()
plt.show()

其中, x ( t ) x(t) x(t)是原始信号, y ( t ) y(t) y(t)是经过余弦变换之后的信号。window的作用是将 y y y的部分数值置零,从而使用部分 y ( t ) y(t) y(t)经由逆变换得到 x ( t ) x(t) x(t),最终结果如下。相比于保留20个数值的情况,只保留15个数值显然引入了更大的抖动。

在这里插入图片描述

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值