关于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输入数组。
类型:{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−2xncos(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=⎩⎨⎧21N−11 21N−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−1xncos(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离散余弦变换函数相关推荐
- JPEG压缩原理与DCT离散余弦变换
原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔 1 前言 JPEG是joint Photographic E ...
- JPEG图像压缩原理与DCT离散余弦变换
原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔 1 前言 JPEG是joint Photographic E ...
- 数字图像处理学习笔记(十八)实现图像的离散余弦变换
实验截图: 自带函数实现的离散余弦变换: 利用公式求出的DCT和IDCT 实验代码: 代码(1): img=imread('erciyuan.jpg'); img=rgb2gray(img); fig ...
- 理解DCT与DST【二】:离散余弦变换
本文主要是将先前的博客 离散傅里叶变换DFT.离散余弦变换DCT.离散正弦变换DST,原理与公式推导 从图片修改为 Markdown 脚本,方便读者浏览,同时增加了部分内容.但由于文章字符过多,无法全 ...
- 把游戏里面的 UI 做成前端组件库会怎么样?
在研究生的时候用 Vue2.0 做过一个守望先锋UI库. 当时很沉迷<守望先锋>,有一天突发奇想:我要把游戏里面的 UI 做成前端组件库会怎么样? 然后就一步步开始做了,最后也算把它给实现 ...
- dct变换的主要优点有哪些_数字图像处理(三)—— 离散余弦变换
离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分.有这样一个性质:如果信号 在给定区 ...
- 离散余弦DCT域的数字水印
基于MATLAB的离散余弦DCT域的数字水印 一.数字水印技术的概述 1.1数字水印的概述 伴随着计算机网络的发展,信息媒体的数字化为信息的存取提供了巨大的便利,显著提高了信息表达的效率和准确性.但是 ...
- 图像处理 离散余弦变换
什么是DCT 一维DCT变换 一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换.一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单.适用范围广.我们在这里只讨论 ...
- Python数据分析入门--SciPy库学习笔记
文章目录 前言 Scipy库简单入门 1.cluster模块 2. constants模块 3. fftpack模块 4. integrate 模块 5. interpolate 模块 6. lina ...
最新文章
- 使用Cydia Substrate Hook Android Java世界
- mysql的从节点能否执行事务_MySQL执行事务的语法与流程详解
- redisb并发访问慢出现的问题
- vb.net利用SerialPort进行读取串口操作
- 百度测试新搜索结果页面 改进灵感来自谷歌?
- Netty技术细节源码分析-FastThreadLocal源码分析
- springboot 后台模板_spring boot实战
- ubuntu安装vasp_Ubuntu常用软件的安装
- 多商户商城小程序系统(附微信抖音小程序商城分销系统源码)
- LTE学习笔记--LTE整体架构和协议架构概述
- 微信小程序登录-开发文档
- Linux的常见问题解答和管理技巧
- Pycharm, 生成可执行文件,Unhandled exception in script报错
- Mac修改iPhone备份到移动硬盘或其他位置,避免备份空间不足
- iOS 获取当前的UIViewController
- asp.net 改变css,使用ASP.NET动态设置CSS值
- 天籁obd接口针脚定义_2013新天籁加装OBD胎压监测+无损改装彻底解决亏电求加精...
- 计算机网络组建游戏,让游戏飞起来!微星H77实战混合硬盘组建
- IP175G调试总结
- 基于智能矿山电力监控系统的设计与应用方法