使用Python实现正反离散余弦变换,不要使用numpy内置的dct和idct
大家好,感谢你们提前的帮助和支持!
我正在尝试在Python中对下面的方程进行正余弦变换,但我总是遇到一个错误,提示“索引超出范围”。我已经尝试了各种方法来修正这个问题,但都没有成功。下面是我写的Python程序。你们的帮助将对我非常重要,谢谢!
F_k = .5*[f_0 + ((-1)**k)*f_N] + f_j*cos(pi*j*k/N) j=[1 N-1]
import numpy as np
import matplotlib.pyplot as plt
def dct(f_j):
n = len(f_j)
F_k = np.zeros(n, dtype=float)
for k in range(n):
out = f_j[0]
for j in range(1, n + 1):
out += 0.5*f_j[1]+0.5*f_j[k+1]*(-1)**(n-1) + f_j[j] * np.cos(np.pi * k * j/n)
F_k = out
return F_k
def idct(F_k):
N = len(F_k)
f_j = np.zeros(N, dtype=float)
for j in range(N):
output = F_k[0]
for k in range(1, N + 1):
output += .5*F_k[1]+0.5*F_k[j+1]*(-1)**(N-1) + F_k[k]*np.cos(np.pi * k * j / N)
f_j = output * (2 / N)
return f_j
1 个回答
0
离散余弦变换有几种定义。看起来你想要的是维基百科上的DCT-I定义。如果是这样的话,你的代码应该像这样:
def dct( f_j ):
n = len(f_j)
F_k = np.zeros(n)
for k in range(n):
F_k[k] = 0.5 * ( f_j[0] + (-1)**k * f_j[n-1] )
for j in range(1, n - 1):
F_k[k] += f_j[j] * np.cos(np.pi * j * k / (n-1))
return F_k
我觉得你可能对DCT的数学定义和Python中的索引有些混淆,因为Python的索引是从0
开始的。另外要注意,for k in range(n)
会生成从0
到n-1
的值,而for j in range(1, n-1)
会生成从1
到n-2
的值。