问题描述

我们在手写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输入数组。
类型:{1、2、3、4},可选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)kxN−1​+2n=1∑N−2​xn​cos(N−1π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=⎩⎨⎧​21​N−11​ ​21​N−12​ ​​if k=0 or N−1,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=0∑N−1​xn​cos(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​
以上就是问题的解决方案了,如果还有不明白的的友友可以点个关注,私信我哟!

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

  1. JPEG压缩原理与DCT离散余弦变换

    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔 1 前言 JPEG是joint Photographic E ...

  2. JPEG图像压缩原理与DCT离散余弦变换

    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔 1 前言 JPEG是joint Photographic E ...

  3. 数字图像处理学习笔记(十八)实现图像的离散余弦变换

    实验截图: 自带函数实现的离散余弦变换: 利用公式求出的DCT和IDCT 实验代码: 代码(1): img=imread('erciyuan.jpg'); img=rgb2gray(img); fig ...

  4. 理解DCT与DST【二】:离散余弦变换

    本文主要是将先前的博客 离散傅里叶变换DFT.离散余弦变换DCT.离散正弦变换DST,原理与公式推导 从图片修改为 Markdown 脚本,方便读者浏览,同时增加了部分内容.但由于文章字符过多,无法全 ...

  5. 把游戏里面的 UI 做成前端组件库会怎么样?

    在研究生的时候用 Vue2.0 做过一个守望先锋UI库. 当时很沉迷<守望先锋>,有一天突发奇想:我要把游戏里面的 UI 做成前端组件库会怎么样? 然后就一步步开始做了,最后也算把它给实现 ...

  6. dct变换的主要优点有哪些_数字图像处理(三)—— 离散余弦变换

    离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分.有这样一个性质:如果信号 在给定区 ...

  7. 离散余弦DCT域的数字水印

    基于MATLAB的离散余弦DCT域的数字水印 一.数字水印技术的概述 1.1数字水印的概述 伴随着计算机网络的发展,信息媒体的数字化为信息的存取提供了巨大的便利,显著提高了信息表达的效率和准确性.但是 ...

  8. 图像处理 离散余弦变换

    什么是DCT 一维DCT变换 一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换.一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单.适用范围广.我们在这里只讨论 ...

  9. Python数据分析入门--SciPy库学习笔记

    文章目录 前言 Scipy库简单入门 1.cluster模块 2. constants模块 3. fftpack模块 4. integrate 模块 5. interpolate 模块 6. lina ...

最新文章

  1. 使用Cydia Substrate Hook Android Java世界
  2. mysql的从节点能否执行事务_MySQL执行事务的语法与流程详解
  3. redisb并发访问慢出现的问题
  4. vb.net利用SerialPort进行读取串口操作
  5. 百度测试新搜索结果页面 改进灵感来自谷歌?
  6. Netty技术细节源码分析-FastThreadLocal源码分析
  7. springboot 后台模板_spring boot实战
  8. ubuntu安装vasp_Ubuntu常用软件的安装
  9. 多商户商城小程序系统(附微信抖音小程序商城分销系统源码)
  10. LTE学习笔记--LTE整体架构和协议架构概述
  11. 微信小程序登录-开发文档
  12. Linux的常见问题解答和管理技巧
  13. Pycharm, 生成可执行文件,Unhandled exception in script报错
  14. Mac修改iPhone备份到移动硬盘或其他位置,避免备份空间不足
  15. iOS 获取当前的UIViewController
  16. asp.net 改变css,使用ASP.NET动态设置CSS值
  17. 天籁obd接口针脚定义_2013新天籁加装OBD胎压监测+无损改装彻底解决亏电求加精...
  18. 计算机网络组建游戏,让游戏飞起来!微星H77实战混合硬盘组建
  19. IP175G调试总结
  20. 基于智能矿山电力监控系统的设计与应用方法

热门文章

  1. C语言——冒泡排序(分析详解)
  2. 如何查看内核版本和ubuntu版本
  3. 【Matlab】时间序列周期性分析
  4. 05【数据的备份与恢复】
  5. wasc honeypot
  6. FactoryBean的使用~
  7. 前端规范 - 前端项目开发规范
  8. java计算器gui(有三角函数,幂运算)
  9. 学习英语的方法(转载)
  10. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(一)