🫑Python线性代数数字图像和小波分析之二
Python | 线性代数 | 线性方程 | 小波分析 | 离散傅里叶 | 傅里叶分析 | 离散时间滤波器 | 数字音频 | Karplus-强算法 | 离散余弦变换 | 数学 | 二维 三维 | 张量积 | 快速傅里叶变换 | 信号处理 | 图像压缩 | 低通滤波器 | 高通滤波器 | 无限脉冲响应 | 离散小波变换 | 滤波器组变换 | 数字图像
要点
数学方程:数字信号和傅里叶分析,离散时间滤波器,小波分析
Python代码实现及应用变换过程:
读取音频和处理音频波,使用Karplus-强算法制作吉他音频
离散傅里叶计算功能和绘制图示结果
计算波形傅里叶系数
正向和反向(逆)快速傅里叶FFT 实现和使用
位反转函数
正向和反向(逆)离散余弦变换
离散时间滤波器结果绘图
一维、二维和三维正向和反向(逆)离散小波变换
张量积将小波应用于图像,二维和三维张量积实现
离散傅里叶分析数字声音
数字声音
数字声音的质量通常通过比特率(每秒的位数)来衡量,即采样率与用于存储每个样本的位数(二进制数字)的乘积。 采样率和数字格式都会影响最终声音的质量。 这些被封装在数字声音格式中。
观察Python合成声音
首先,合成是使用各种方法创建声音的行为。 我将重点关注加法合成,即通过将不同信号相加的方式进行合成。
我将使用的库是 Numpy 和 Scipy。 Numpy 是一个用于数值计算的库,而 Scipy 是一个我将用于信号处理并将数据转换为声音文件的库。 我还将安装 matplotlib 来绘制声音信号。 Pydub 是一个用于播放音频的库。 为了安装这些包,我将使用 pip 并创建一个虚拟环境。我使用的是 Python 3.10,因此请调整您的 Python 安装说明。 在终端中,我们首先创建一个目录,然后创建一个 virtualenv 并安装必需的软件包。
请创建一个名为 sound.py 的新文件并在文本编辑器中打开它。这将是我用来合成声音的主文件。现在让我首先添加需要的导入。
让我们来回顾一下什么是声音。 声音是空气穿过空间的压力波。 它是一种称为纵波的波,意味着它垂直于传播方向移动。
声音可以表示为信号。 信号是一组随时间变化的数字,通常用方括号表示,例如 x[n]。 我们可以将信号设置为始终等于 1,例如 x[n]=1,或者创建一个像 x[n] = n 这样变化的线性信号。 出于我们的目的,我们将处理像正弦这样的周期性信号。 它们的形式为 x[n] = A sin(2πfn),其中 A 是振幅,f 是频率。 信号的 y 轴是幅度或音量,x 轴是当前时间。
让我们尝试使用以下方程生成正弦波。
A 是幅度,f 是信号的频率。 频率是每秒的样本数。 它决定了声音的音调,较低的频率有更多的低音,较高的频率有更多的高音。 为该声音生成波形文件的代码如下所示。
我们首先有音频速率常数,也称为采样率,它是声卡从麦克风或其他音频输入源采样音频的速率。 在本例中,频率将为 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 中的绘图函数绘制信号。
如果我们绘制前 512 个样本,这就是我们得到的图。
方波类似,但我们使用方形而不是正弦曲线。这使用阶跃函数代替正弦函数来计算。我们可以使用正弦函数和 Heaviside 阶跃函数来实现这一点。
我们可以使用 Scipy 的 signal.square 函数实现同样的效果。
方波会产生比正弦波更刺耳的嗡嗡声。这是因为方波比只有一种音调的正弦波有更多的泛音。
离散傅里叶分析
以下引理表明傅立叶基是正交的,因此它确实是一个基。
离散傅里叶变换
此方程也称为合成方程。
Python离散傅里叶变换计算并绘制振幅谱
离散傅里叶变换可以将均匀间隔的信号序列变换为需要求和为时域信号的所有正弦波的频率信息。它定义为:
让我们看看如何使用它。
编写一个函数 FT(x),它接受一个参数,x - 输入一维实值信号。该函数将计算信号的 DFT 并返回 DFT 值。将此函数应用于我们上面生成的信号并绘制结果。
绘制 DFT 结果的前半部分,我们可以看到频率为 1 Hz、4 Hz 和 7 Hz 的 3 个清晰峰值,幅度为 3、1、0.5,符合预期。 这就是我们如何使用离散傅里叶变换将任意信号分解为简单的正弦波来分析它。
数字图像小波分析
小波是具有与傅里叶基不同性质的函数基,因此它们可以用来解决上述的一些缺点。 与傅立叶基相反,小波基不是固定的:存在多种此类基,用于不同的应用。
Last updated