使用Python实现正反离散余弦变换,不要使用numpy内置的dct和idct

-2 投票
1 回答
643 浏览
提问于 2025-04-18 13:29

大家好,感谢你们提前的帮助和支持!

我正在尝试在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)会生成从0n-1的值,而for j in range(1, n-1)会生成从1n-2的值。

撰写回答