Python线性代数数字图像和小波分析之二

要点

  1. 数学方程:数字信号和傅里叶分析,离散时间滤波器,小波分析
  2. Python代码实现及应用变换过程:
    1. 读取音频和处理音频波,使用Karplus-强算法制作吉他音频
    2. 离散傅里叶计算功能和绘制图示结果
    3. 计算波形傅里叶系数
    4. 正向和反向(逆)快速傅里叶FFT 实现和使用
    5. 位反转函数
    6. 正向和反向(逆)离散余弦变换
    7. 离散时间滤波器结果绘图
    8. 一维、二维和三维正向和反向(逆)离散小波变换
    9. 张量积将小波应用于图像,二维和三维张量积实现

离散傅里叶分析数字声音

数字声音

数字声音是一个序列 x = { x i } i = 0 N − 1 \boldsymbol{x}=\left\{x_i\right\}_{i=0}^{N-1} x={xi}i=0N1,对应于记录的 a a a连续声音 f f f的测量值以每秒 f s f_s fs 测量的固定速率,即
x k = f ( k / f s ) , 对于  k = 0 , 1 , … , N − 1 .  x_k=f\left(k / f_s\right), \quad \text { 对于 } k=0,1, \ldots, N-1 \text {. } xk=f(k/fs), 对于 k=0,1,,N1
f s f_s fs 称为采样频率或采样率。数字声音中的组成部分称为样本,连续样本之间的时间称为采样周期,通常表示为 T s T_s Ts。测量声音也称为对声音进行采样。

数字声音的质量通常通过比特率(每秒的位数)来衡量,即采样率与用于存储每个样本的位数(二进制数字)的乘积。 采样率和数字格式都会影响最终声音的质量。 这些被封装在数字声音格式中。

观察Python合成声音

首先,合成是使用各种方法创建声音的行为。 我将重点关注加法合成,即通过将不同信号相加的方式进行合成。

我将使用的库是 Numpy 和 Scipy。 Numpy 是一个用于数值计算的库,而 Scipy 是一个我将用于信号处理并将数据转换为声音文件的库。 我还将安装 matplotlib 来绘制声音信号。 Pydub 是一个用于播放音频的库。 为了安装这些包,我将使用 pip 并创建一个虚拟环境。我使用的是 Python 3.10,因此请调整您的 Python 安装说明。 在终端中,我们首先创建一个目录,然后创建一个 virtualenv 并安装必需的软件包。

请创建一个名为 sound.py 的新文件并在文本编辑器中打开它。这将是我用来合成声音的主文件。现在让我首先添加需要的导入。

import numpy as np
from scipy.io.wavfile import write
from scipy import signal
import matplotlib.pyplot as plt

让我们来回顾一下什么是声音。 声音是空气穿过空间的压力波。 它是一种称为纵波的波,意味着它垂直于传播方向移动。

声音可以表示为信号。 信号是一组随时间变化的数字,通常用方括号表示,例如 x [ n ] x[n] x[n]。 我们可以将信号设置为始终等于 1,例如 x [ n ] x[n] x[n]=1,或者创建一个像 x [ n ] x[n] x[n] = n n n 这样变化的线性信号。 出于我们的目的,我们将处理像正弦这样的周期性信号。 它们的形式为 x [ n ] x[n] x[n] = A s i n ( 2 π f n ) A sin(2πfn) Asin(2πfn),其中 A A A 是振幅, f f f 是频率。 信号的 y y y 轴是幅度或音量, x x x 轴是当前时间。

让我们尝试使用以下方程生成正弦波。
y [ n ] = A sin ⁡ ( 2 π f t [ n ] ) y[n]=A \sin (2 \pi f t[n]) y[n]=Asin(2πft[n])
A 是幅度,f 是信号的频率。 频率是每秒的样本数。 它决定了声音的音调,较低的频率有更多的低音,较高的频率有更多的高音。 为该声音生成波形文件的代码如下所示。

AUDIO_RATE = 44100
freq = 440
length = 1# create time values
t = np.linspace(0, length, length * AUDIO_RATE, dtype=np.float32)
# generate y values for signal
y = np.sin(2 * np.pi * freq * t)
# save to wave file
write("sine.wav", AUDIO_RATE, y)

我们首先有音频速率常数,也称为采样率,它是声卡从麦克风或其他音频输入源采样音频的速率。 在本例中,频率将为 44,100Hz。 赫兹 (Hz) 是频率的标准度量,是大多数声卡上每秒的样本数。 其原因是人类听觉的限制和奈奎斯特采样定理。 其中指出,要播放频率最多为 f 的声音,我们至少需要 2f 个样本。 人的听觉通常敏感度为20,000Hz,这意味着采样率需要在40,000Hz以上。

这意味着我们需要在几秒内生成相当于音频剪辑长度 44,100 倍的样本数量。 在本例中,我们需要 1 秒的音频剪辑,因此需要将音频速率乘以 1。这将使我们能够生成跨越人类听觉范围的声音。

我们使用 linspace 生成时间值,范围从 0 到 1,样本数为 1 * AUDIO_RATE,即 44100 个样本。 然后使用每个时间值的 sin 计算信号。 频率为440Hz,即中A。然后我们可以使用Scipy中的write函数和相应的AUDIO_RATE将声音写入波形文件。

如果您听 sine.wav,您会听到短促的一秒正弦波声音。 这听起来像是扬声器发出蜂鸣声,如果您听不到它,请检查以确保代码正确并且您的音频设置也正确。 您的音频格式可能需要在设置中设置为 44,100Hz。

让我们使用 matplotlib 中的绘图函数绘制信号。

def plot(ts, ys, title, num_samples):plt.xlabel("t")plt.ylabel("y")plt.title(title)plt.plot(ys[:num_samples])plt.show()plot(t, y, "Sine Signal", 512)

如果我们绘制前 512 个样本,这就是我们得到的图。

方波类似,但我们使用方形而不是正弦曲线。这使用阶跃函数代替正弦函数来计算。我们可以使用正弦函数和 Heaviside 阶跃函数来实现这一点。

y = np.heaviside(np.sin(2 * np.pi * freq * t), 1.0)

我们可以使用 Scipy 的 signal.square 函数实现同样的效果。

t = np.linspace(0, length, length * AUDIO_RATE, dtype=np.float32)# generate y values for signal
y = signal.square(2 * np.pi * freq * t)
# save to wave file
write("square.wav", AUDIO_RATE, y)plot(t, y, "Square Signal", 512)

方波会产生比正弦波更刺耳的嗡嗡声。这是因为方波比只有一种音调的正弦波有更多的泛音。

离散傅里叶分析

在离散傅里叶分析中,向量 x = ( x 0 , … , x N − 1 ) \boldsymbol{x}=\left(x_0, \ldots, x_{N-1}\right) x=(x0,,xN1) 表示为 N N N 个向量的线性组合
ϕ n = 1 N ( 1 , e 2 π i n / N , e 2 π i 2 n / N , … , e 2 π i k n / N , … , e 2 π i n ( N − 1 ) / N ) \phi_n=\frac{1}{\sqrt{N}}\left(1, e^{2 \pi i n / N}, e^{2 \pi i 2 n / N}, \ldots, e^{2 \pi i k n / N}, \ldots, e^{2 \pi i n(N-1) / N}\right) ϕn=N 1(1,e2πin/N,e2πi2n/N,,e2πikn/N,,e2πin(N1)/N)
这些向量称为归一化复指数,或 N N N 阶纯数字音调。 n n n也称为频率指数。整个集合 F N = { ϕ n } n = 0 N − 1 \mathcal{F}_N=\left\{\phi_n\right\}_{n=0}^{N-1} FN={ϕn}n=0N1称为 N N N点傅里叶基。

请注意,纯数字音可以被视为纯音的样本,在一个周期内均匀采集: f ( t ) = e 2 π i n t / T / N f(t)=e^{2 \pi i n t / T} / \sqrt{N} f(t)=e2πint/T/N 是具有频率的纯音 n / T n / T n/T,其样本为
f ( k T / N ) = e 2 π i n ( k T / N ) / T N = e 2 π i n k / N N , f(k T / N)=\frac{e^{2 \pi i n(k T / N) / T}}{\sqrt{N}}=\frac{e^{2 \pi i n k / N}}{\sqrt{N}}, f(kT/N)=N e2πin(kT/N)/T=N e2πink/N,
将纯音映射到数字纯音时,索引 n n n 对应于频率 ν = n / T \nu=n / T ν=n/T N N N 对应于一个周期内采集的样本数。由于 T f s = N T f_s=N Tfs=N,其中 f s f_s fs是采样频率,因此我们在频率和频率指数之间有以下联系:
ν = n f s N and  n = ν N f s \nu=\frac{n f_s}{N} \text { and } n=\frac{\nu N}{f_s} ν=Nnfs and n=fsνN
以下引理表明傅立叶基是正交的,因此它确实是一个基。

离散傅里叶变换

我们用 F N F_N FN来表示坐标矩阵,从标准基 R N \mathbb{R}^N RN到傅里叶基 F N \mathcal{F}_N FN的变化。我们也将其称为( N N N​点)傅立叶矩阵。

矩阵 N F N \sqrt{N} F_N N FN 也称为( N N N点)离散傅里叶变换,或 DFT。如果 x \boldsymbol{x} x R N R^N RN中的向量,则 y = \boldsymbol{y}= y= DFT x \boldsymbol{x} x称为 x \boldsymbol{x} x的DFT系数。 (因此,DFT 系数是 F N \mathcal{F}_N FN 中的坐标,用 N \sqrt{N} N 缩放)。 DFT x \boldsymbol{x} x 有时写为 x ^ \hat{\boldsymbol{x}} x^​。

请注意,我们将傅立叶矩阵和 DFT 定义为两个不同的矩阵,一个是另一个的缩放版本。究其原因,在于不同领域有不同的传统。在纯数学中,主要使用傅立叶矩阵,因为正如我们将看到的,它是酉矩阵。在信号处理中,主要使用 DFT 提供的缩放版本。我们通常将 R N \mathbb{R}^N RN中的给定向量写为 x \boldsymbol{x} x,并为其DFT写为 y \boldsymbol{y} y。在应用领域中,傅里叶基向量也称为合成向量,因为它们可以用来“合成”向量 x \boldsymbol{x} x,其权重由傅里叶基中的坐标提供,即
x = y 0 ϕ 0 + y 1 ϕ 1 + ⋯ + y N − 1 ϕ N − 1 .  \boldsymbol{x}=y_0 \phi_0+y_1 \phi_1+\cdots+y_{N-1} \phi_{N-1} \text {. } x=y0ϕ0+y1ϕ1++yN1ϕN1
此方程也称为合成方程。

Python离散傅里叶变换计算并绘制振幅谱

离散傅里叶变换可以将均匀间隔的信号序列变换为需要求和为时域信号的所有正弦波的频率信息。它定义为:
X k = ∑ n = 0 N − 1 x n ⋅ e − i 2 π k n / N = ∑ n = 0 N − 1 x n [ cos ⁡ ( 2 π k n / N ) − i ⋅ sin ⁡ ( 2 π k n / N ) ] X_k=\sum_{n=0}^{N-1} x_n \cdot e^{-i 2 \pi k n / N}=\sum_{n=0}^{N-1} x_n[\cos (2 \pi k n / N)-i \cdot \sin (2 \pi k n / N)] Xk=n=0N1xnei2πkn/N=n=0N1xn[cos(2πkn/N)isin(2πkn/N)]
让我们看看如何使用它。

import matplotlib.pyplot as plt
import numpy as npplt.style.use('seaborn-poster')
%matplotlib inline# sampling rate
sr = 100
# sampling interval
ts = 1.0/sr
t = np.arange(0,1,ts)freq = 1.
x = 3*np.sin(2*np.pi*freq*t)freq = 4
x += np.sin(2*np.pi*freq*t)freq = 7   
x += 0.5* np.sin(2*np.pi*freq*t)plt.figure(figsize = (8, 6))
plt.plot(t, x, 'r')
plt.ylabel('Amplitude')plt.show()

编写一个函数 FT(x),它接受一个参数,x - 输入一维实值信号。该函数将计算信号的 DFT 并返回 DFT 值。将此函数应用于我们上面生成的信号并绘制结果。

def FT(x):N = len(x)n = np.arange(N)k = n.reshape((N, 1))e = np.exp(-2j * np.pi * k * n / N)X = np.dot(e, x)return XX = FT(x)N = len(X)
n = np.arange(N)
T = N/sr
freq = n/T plt.figure(figsize = (8, 6))
plt.stem(freq, abs(X), 'b', \markerfmt=" ", basefmt="-b")
plt.xlabel('Freq (Hz)')
plt.ylabel('Amplitude |X(freq)|')
plt.show()

绘制 DFT 结果的前半部分,我们可以看到频率为 1 Hz、4 Hz 和 7 Hz 的 3 个清晰峰值,幅度为 3、1、0.5,符合预期。 这就是我们如何使用离散傅里叶变换将任意信号分解为简单的正弦波来分析它。

数字图像小波分析

小波是具有与傅里叶基不同性质的函数基,因此它们可以用来解决上述的一些缺点。 与傅立叶基相反,小波基不是固定的:存在多种此类基,用于不同的应用。

Python线性代数傅里叶分析和动态系统模拟分析之一

参阅一:计算思维
参阅二:亚图跨际

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

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

相关文章

1_SQL

文章目录 前端复习SQL数据库的分类关系型数据库非关系型数据库(NoSQL) 数据库的构成软件架构MySQL内部数据组织方式 SQL语言登录数据库数据库操作查看库创建库删除库修改库 数据库中表的操作选择数据库创建表删除表查看表修改表 数据库中数据的操作添加数…

性别和年龄的视频实时监测项目

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 性别和年龄检测 Python 项目 首先介绍性别和年龄检测的高级Python项目中使用的专业术语 什么是计算机视觉? 计算机视觉是使计算机能…

基于Camunda实现bpmn 2.0各种类型的任务

基于Camunda实现bpmn中各种类型任务 ​ Camunda Modeler -为流程设置器(建模工具),用来构建我们的流程模型。Camunda Modeler流程绘图工具,支持三种协议类型流程文件分别为:BPMN、DMN、Form。 ​ Camunda Modeler下载…

笨办法:基于后端Matplotlib生成图片, 前端绘制报表

很久很久以前, 做过一个项目, 因为前端基础差, echarts捣鼓不来, 然后就折腾出来一套比较奇葩的技术方案, 就是前端需要什么图表, 后端先绘制好, 然后前端需要什么图表, 再从后端拉取后端之前响应的图片路径, 再去做渲染。 其实基于后端使用 Matplotlib 绘制图表,前端…

DangZero:通过直接页表访问的高效UAF检测(摘要及介绍及背景翻译)

先通过翻译过一遍文章,然后再对每个章节进行总结 摘要 Use-after-free vulnerabilities remain difficult to detect and mitigate, making them a popular source of exploitation. Existing solutions in- cur impractical performance/memory overhead, requir…

powershell界面中,dir命令的效果

常用参数 -path D:\111\111_2。读取指定路径。 -Name。只输出文件名 -Include *.txt。指定后缀的文件 -Recurse。搜索目录及其子目录。 -Force。显示具有 h 模式的隐藏文件。 >1dir.txt。将结果入指定文件 各参数使用效果 dir PS D:\111\111_2> dir 目录: D:\111…

初中孩子最近不愿意上学怎么办?有什么好方法可以解决?

这个年龄段属于叛逆期,这个时候孩子出现厌学问题很正常,家长应该多些耐心和时间,不要一味地责骂,会更加排斥和反感,叛逆的。可以跟孩子好好谈谈聊聊,学会倾听他的心声,愿意听你说话在教育和引导…

配置MySQL与登录模块

使用技术 MySQL,Mybatis-plus,spring-security,jwt验证,vue 1. 配置Mysql 1.1 下载 MySQL :: Download MySQL Installer 1.2 安装 其他页面全选默认即可 1.3 配置环境变量 将C:\Program Files\MySQL\MySQL Server 8.0\bin…

10个常见的Java面试问题及其答案

问题: Java的主要特性是什么? 答案: Java的主要特性包括面向对象、平台无关、自动内存管理、安全性、多线程支持、丰富的API和强大的社区支持。 问题: 什么是Java的垃圾回收机制? 答案: Java的垃圾回收机…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…

Avalonia学习(二十八)-OpenGL

Avalonia已经继承了opengl,详细的大家可以自己查阅。Avalonia里面启用opengl继承OpenGlControlBase类就可以了。有三个方法。分别是初始化、绘制、释放。 这里把官方源码的例子扒出来给大家看一下。源码在我以前发布的单组件里面。地址在前面的界面总结博文里面。 …

图数据库 之 Neo4j - 应用场景4 - 反洗钱(9)

原理 Neo4j图数据库可以用于构建和分析数据之间的关系。它使用节点和关系来表示数据,并提供实时查询能力。通过使用Neo4j,可以将大量的交易数据导入图数据库,并通过查询和分析图结构来发现洗钱行为中的模式和关联。 案例分析 假设有一家转账服务公司,有以下交易数据,每个…

YOLOv9有效改进|使用空间和通道重建卷积SCConv改进RepNCSPELAN4

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、改进点介绍 SCConv是一种即插即用的空间和通道重建卷积。 RepNCSPELAN4是YOLOv9中的特征提取模块,类似YOLOv5和v8中的C2f与C3模块。 …

突破编程_C++_设计模式(建造者模式)

1 建造者模式的概念 建造者模式(Builder Pattern)是一种创建型设计模式,也被称为生成器模式。它的核心思想是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 在建造者模式中,通常包括以…

MySQL进阶:MySQL事务、并发事务问题及隔离级别

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习、 🌌上期文章:MySQL进阶:视图&&存储过程&&存储函数&&触发器 📚订阅专栏:MySQL进…

Docker Machine windows系统下 安装

如果你是 Windows 平台,可以使用 Git BASH,并输入以下命令: basehttps://github.com/docker/machine/releases/download/v0.16.0 &&mkdir -p "$HOME/bin" &&curl -L $base/docker-machine-Windows-x86_64.exe >…

点燃技能火花:探索PyTorch学习网站,开启AI编程之旅!

介绍:PyTorch是一个开源的Python机器学习库,它基于Torch,专为深度学习和科学计算而设计,特别适合于自然语言处理等应用程序。以下是对PyTorch的详细介绍: 历史背景:PyTorch起源于Torch,一个用于…

【真机Bug】异步加载资源未完成访问单例导致资源创建失败

1.错误表现描述 抽卡时,10抽展示界面为A。抽取内容可能是整卡或者碎片,抽到整卡,会有立绘展示和点击详情的按钮。点击详情后出现详情页B。【此时界面A预制体被销毁,卡片数据进入数据缓存池】点击页面B的返回按钮,单例…

C++——模版

前言:哈喽小伙伴们好久不见,这是2024年的第一篇博文,我们将继续C的学习,今天这篇文章,我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版,我们…

线索二叉树

线索二叉树即从前、中、后序三种遍历中其中一种来看,树中的左右孩子都不会是空着的,都会指向对应的前驱和后驱。 以中序遍历为例,二叉树线索化过程如下: 先是树的结构 typedef struct ThreadNode{Elemetype data;struct ThreadNo…