数字信号处理-9-离散余弦变换

news2025/6/30 0:42:57

1 波形合成

假定给一系列振幅和一系列频率,要求构建一个信号,此信号是这些频率元素的和。这样的操作就是合成

def synthesize(amps, fs, ts):
	"""
	amps 振幅数组
	fs 频率数组
	ts 采样时间点
	"""
    # ts 和 fs 的外积, m*n 矩阵
    # 每行表示 ts 的一个元素,每列表示 fs 的一个元素 
    # 每个元素表示时间和频率的乘积 ft
    args = np.outer(ts, fs)
    print(args.shape) #(11025, 4)
    # m*n 矩阵,每个元素表示 cos(2πft)
    M = np.cos(PI2*args)
    print(M.shape) #(11025, 4)
    # 点乘 m*n × n*1 = m*1
    ys = np.dot(M, amps)
    print(ys.shape) #(11025,)
    return ys
# 生成一秒时长的波形
duration=1
# 采样率
framerate=11025
fs = [100, 200, 300, 400]
amps = np.array([0.6, 0.25, 0.1, 0.005])
# 样本数
n = round(duration * framerate)
# 采样时间点
ts = np.arange(n) / framerate

synthesize(amps, fs, ts)

代码中 M 矩阵的每一行对应的时间从 0.0s 到 1.0 秒,共11025 行,表示 11025 个时间点。列表示相同时间点对应的不同频率, n p . d o t ( M , a m p s ) np.dot(M, amps) np.dot(M,amps) 会将 M 的一行也即频率cos值乘以振幅 amps,随后加和。最后返回的 ys 即是每一个时间点不同频率cos值对应的振幅加和。

计算公式表示如下:
在这里插入图片描述

关于外积

在这里插入图片描述

2 分析

现在求上面的逆问题,也就是知道一个波形由一系列给定频率的余弦信号加和而成的,如何计算出各个频率元素对应的振幅?换种方式说就是,给定 ys、ts 和 fs, 如何算出 amps?

在合成中我们用到了如下公式:
在这里插入图片描述

2.1 通过线性方程组求解

反过来在逆运算中:

同样首先计算矩阵 M = cos(2πt⊗f )

随后我们需要找到 a 使得 y = Ma

M 有 11025 行, 4列(4 个频率元素)。它的每一行都是 4 个频率乘以对应的振幅加和得到的,所以我们可以取 M 的前 4 行进行计算,4 个未知数 4个方程,相当于求线性方程组。

NumPy 提供 linalg.solve 求 a

def analyze(ys, fs, ts):
    args = np.outer(ts, fs)
    M = np.cos(PI2*args)
    amps = np.linalg.solve(M, ys)
    return amps

ys = synthesize(amps, fs, ts)

# 频率个数
n = len(fs)
analyze(ys[:n], fs, ts[:n])    

out:array([0.6  , 0.25 , 0.1  , 0.005])

2.2 通过正交矩阵求解

上面解线性方程组是一种比较耗时的操作,需要的时间和 n3 成正比,所以我们需要更好的方法。

如果 M 是方阵且可逆的话,在线性代数我们可以对 M 求逆得到 a: a = M − 1 y a = M^{-1}y a=M1y

这就意味着如果能够高效地计算 M-1,就能使用简单的矩阵操作得到 a。这样的耗时正比于 n2

求逆也是一个耗时的操作,但如果 M 是正交矩阵(I = MMT),那么 M 的转置就是 M 的逆矩阵。求转置是一个常数操作时间。

通过选择合适的 ts 和 fs, 可以让 M 成为正交矩阵。方法有多种,这也是离散余弦变换有多个版本的原因。

一种简单的方法是平移 ts 和 fs 半个单位。这个版本称为 DCT-IV,意思是 DCT 的 8 个版本 中的第 4 个。

DCT-IV

def dct_iv(ys):
    N = len(ys)
    ts = (0.5 + np.arange(N))/N
    fs = (0.5 + np.arange(N))/2
    args = np.outer(ts, fs)
    M = np.cos(PI2*args)
    amps = np.dot(M, ys)/2
    return amps

amps = np.array([0.6, 0.25, 0.1, 0.05])
N = 4.0
ts = (0.5 + np.arange(N))/N
fs = (0.5 + np.arange(N))/2
ys = synthesize(amps, fs, ts)
dct_iv(ys)

scipy.fft.dct 也提供类似计算

参考

漫画傅里叶解析
Python数字信号处理应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud(十三):Spring 扩展

Spring扩展点 Bean的生命周期中的BeanPostProcessor扩展点Spring扩展点梳理 Spring扩展点应用场景 整合Nacos 服务注册 ApplicationListener扩展场景——监听容器中发布的事件Lifecycle Nacos 发布订阅 & Eureka 服务启动、同步、剔除Lifecycle扩展场景——管理具有启动、停…

JSP快速入门

目录 1、jsp简述 2、JSP快速入门 2.1、搭建环境 2.2、导入JSP页面 2.3、编写代码 2.4、启动测试 3、JSP原理 4、JSP脚本 4.1、JSP脚本的分类 4.2、案例 4.2.1、需求 4.2.2、实现 ​编辑 4.2.3、测试 ​编辑4.3、JSP缺点 5、JSP语法 5.1、JSP页面的基本结构…

【每日一题Day36】LC1742盒子中小球的最大数量 | 哈希表 找规律

盒子中小球的最大数量【LC1742】 You are working in a ball factory where you have n balls numbered from lowLimit up to highLimit inclusive (i.e., n highLimit - lowLimit 1), and an infinite number of boxes numbered from 1 to infinity. Your job at this facto…

[附源码]java毕业设计养老院管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C++ 语言学习 day10 复习(2)

1.友元 的三种形式 /*********** 友元 ************ * ①全局函数做友元 * ②类做友元 * ③类成员函数做友元 * **************************/ 代码&#xff1a; #include <iostream> #include <string> using namespace std;/* ③类函数友元 : 程序规则{ 自上…

Charles下载抓包基本流程

一、Charles官网下载链接&#xff1a; https://www.charlesproxy.com/download/ 二、抓包步骤&#xff1a; 1、安装Charles&#xff0c;并打开 2、电脑设置代理端口&#xff1a; 打开charles->Proxy->Proxy Settings,设置代理端口&#xff0c;如图所示 3、手机设置代…

Day10--配置uni-app的开发环境

1.啥子是ui-app呢&#xff1f; 1》官方介绍&#xff1a; 2》博主介绍 ************************************************************************************************************** 2.开发工具建议使用HBuilder X *************************************************…

BSA/HSA表面修饰二甘醇酐,人血清白蛋白HSA、牛血清白蛋白BSA偶联二甘醇酐

BSA作用&#xff1a; BSA一般做为稳定剂被用于限制酶或者修饰酶的保存溶液和反应液中&#xff0c;因为有些酶在低浓度下不稳定或活性低。加入BSA后&#xff0c;它可能起到“保护”或“载体”作用&#xff0c;不少酶类添加 BSA后能使其活性大幅度提高。不需要加BSA的酶加入BSA一…

【时序预测-SVM】基于鲸鱼算法优化支持向量机SVM实现时序数据预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【数据结构】二叉树详解(上篇)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《数据结构》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 二叉树&…

18 【Redux Toolkit】

18 【Redux Toolkit】 上边的案例我们一直在使用Redux核心库来使用Redux&#xff0c;除了Redux核心库外Redux还为我们提供了一种使用Redux的方式——Redux Toolkit。它的名字起的非常直白&#xff0c;Redux工具包&#xff0c;简称RTK。RTK可以帮助我们处理使用Redux过程中的重…

ABTest样本量计算

A/B 测试一般是比较实验组和对照组在某些指标上是否存在差异&#xff0c;当然更多时候是看实验组相比对照组某个指标表现是否更好。 这样的对比在统计学上叫做两样本假设检验&#xff0c;即实验组和对照组为两样本&#xff0c;假设检验的原假设Ho&#xff1a;实验组和对照组无…

Springboot 整合 JWT + Redis 实现双Token 校验Demo(简单实现)

一、新建一个SpringBoot 项目&#xff0c;springboot项目创建过程详见 mac idea 创建 springboot 项目_JAVA&#xff24;WangJing的博客-CSDN博客_mac idea创建springboot项目 二、SpringBoot 整合使用 Rdis SpringBoot 项目 添加 redis配置_JAVA&#xff24;WangJing的博客…

Linux内存映射函数mmap与匿名内存块

学习系列&#xff1a;《APUE14.8》《CSAPP9.8.4》 1 总结 memory-mapped io可以将文件映射到内存中的buffer&#xff0c;当我们从buffer读写数据时&#xff0c;其实操作的是对应文件中的数据。这样可以达到不使用READ/WRITE的IO操作。mmap也可以直接映射匿名内存块&#xff0c…

零信任对企业安全防护能起到什么作用?

随着网络攻击的不断演变&#xff0c;变得更加普遍和复杂&#xff0c;企业正在寻找一种基于身份的网络安全新方法。这些策略和解决方案旨在保护企业内的所有人和机器&#xff0c;并用于检测和防止身份驱动的违规行为。 企业很容易被感染&#xff0c;但问题在于如何找到解决方案。…

基于花朵授粉算法的无线传感器网络部署优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

hadoop集群安装(二):克隆服务器集群并免密

文章目录说明分享集群构建集群规划角色划分配置主机名、ip和主机名映射ssh免密总结说明 已 上篇 创建模型虚拟机为基础构建hadoop集群 分享 大数据博客列表开发记录汇总个人java工具库 项目https://gitee.com/wangzonghui/object-tool 包含json、string、集合、excel、zip压缩…

美食杰项目 -- 个人主页(四)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰菜谱大全效果2. 引入element-ui3. 代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中 实现个人主页的效果&#xff0c;和具体代码。 具体实现思路&#xff1a; 判断是…

如何复用ijkplayer库实现ffmpeg的功能

ijkplayer库介绍 现在ijkplayer播放器应用的非常广泛&#xff0c;很多播放器基本上都是基于ijkplayer二次迭代开发的&#xff0c;众所周知&#xff0c;ijkplayer是基于ffplay的&#xff0c;所以要使用ijkplayer&#xff0c;就必须使用三个so库。 jeffmonyJeffMonydeMacBook-P…

MySQL Server 和 MySQL Workbench安装

对于开发人员来说&#xff0c;只需要安装 MySQL Server 和 MySQL Workbench 这两个软件&#xff0c;就能满足开发的需要了。 ⚫ MySQL Server&#xff1a;专门用来提供数据存储和服务的软件。 ⚫ MySQL Workbench&#xff1a;可视化的 MySQL 管理工具&#xff0c;通过它&#…