关于scipy库里面的DCT离散余弦变换函数

问题描述

我们在手写DCT离散余弦函数的时候,算出来的值总是与scipy库里面的DCT函数不一样,结果和代码如下所示:

## 这是自己写的dct离散余弦函数
## n代表阶数,0 < n <= 数据长度
## s代表数据,一般是一维
## num是s数据的长度
def dct_test(n,s,num):# n代表阶数>=1,s代表每一帧的滤波器组,维度是(128,),num是滤波器的个数
    result=[]
    for i in range(num):     
        tem=math.cos((math.pi*n*(i+0.5))/(num))
        result.append(s[i]*tem)
    return 2*np.sum(result)
## 这是库函数里面的dct函数
import numpy as np
from scipy import fftpack
from scipy.fftpack import dct, idct
x2 = np.array([-29.31844288,-27.1852446,-9.3301039, 6.6906352,3.85852898,-7.66088315,-9.4338189,-6.94219835,1.32766129,2.97283554])
y2 = dct(x2)
print('离散余弦变换:\n', y2)

原因分析:

因为scipy库里面的函数内部公式是不一样的,这个dct函数一共有8种模式,每一种模式算出来的结果是不一样。但是一般默认为第二种模式,在这里我将详细介绍1,2种模式,其他的模式可以看这个库函数的手册。


解决方案:

我们只要弄清楚dct函数里面不同模式下的不同函数公式就可以了,现在介绍dct函数下的1,2种模式

#dct函数的内部参数
dct(x, type=2, n=None, axis=-1, norm=None, overwrite_x=False)
x:array_like
    输入数组。
类型:{1234},可选
    DCT 的类型(见注释)。默认类型为 2。
n:整数,可选
    变换的长度。如果 ``n < x.shape[axis]``,则 `x` 是
    截断。如果 ``n > x.shape[axis]``,则 `x` 是零填充的。这
    默认结果为“n = x.shape[axis]”。
轴:int,可选
    计算 dct 的轴;默认结束
    最后一个轴(即“axis=-1”)。
norm : {None, 'ortho'}, 可选
    标准化模式(见注释)。默认为无。
overwrite_x : bool,可选
    如果为 True,则可以销毁 `x` 的内容;默认为假。

退货
--------
y :实数的ndarray
    转换后的输入数组。

模式一的公式:如果norm=‘ortho’,则需要乘以下面的缩放因子
y k = x 0 + ( − 1 ) k x N − 1 + 2 ∑ n = 1 N − 2 x n cos ⁡ ( π k n N − 1 ) y_k = x_0 + (-1)^k x_{N-1} + 2 \sum_{n=1}^{N-2} x_n \cos\left( \frac{\pi k n}{N-1} \right) yk=x0+(1)kxN1+2n=1N2xncos(N1πkn)
x f = { 1 2 1 N − 1 if  k = 0  or  N − 1 , 1 2 2 N − 1 otherwise xf = \begin{cases} \frac{1}{2}\sqrt{\frac{1}{N-1}} & \text{if }k=0\text{ or }N-1, \\ \frac{1}{2}\sqrt{\frac{2}{N-1}} & \text{otherwise} \end{cases} xf=21N11 21N12 if k=0 or N1,otherwise

模式二的公式:如果norm=‘ortho’,则需要乘以下面的缩放因子
y k = 2 ∑ n = 0 N − 1 x n cos ⁡ ( π k ( 2 n + 1 ) 2 N ) y_k = 2 \sum_{n=0}^{N-1} x_n \cos\left(\frac{\pi k(2n+1)}{2N} \right) yk=2n=0N1xncos(2Nπk(2n+1))
f = { 1 4 N if  k = 0 , 1 2 N otherwise f = \begin{cases} \sqrt{\frac{1}{4N}} & \text{if }k=0, \\ \sqrt{\frac{1}{2N}} & \text{otherwise} \end{cases} f=4N1 2N1 if k=0,otherwise
以上就是问题的解决方案了,如果还有不明白的的友友可以点个关注,私信我哟!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr Jackin

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值