Python 中的信号处理实践2025年3月17日 | 阅读 14 分钟 从研究到应用:本教程将介绍如何使用 Python 进行频率分析、噪声滤波和幅度谱提取。如果你想处理数据,有一件事可以肯定:要么专注,要么淘汰。过时的想法认为数据科学家可以处理乐高积木、表格数据、图像、文本数据和信号。 鉴于机器学习的出现以及数据分析和计算机硬件的巨大进步,在当今世界,深入了解如何处理特定类型的数据至关重要。这是因为在进入数据科学的另一个领域之前,有一个领域的数据太多,无法在一个领域内全部涵盖。 就我而言,我每天都在使用信号。作为一名拥有物理学硕士学位的数据科学家,我能够理解它们并从中提取有用的信息。在这篇博客文章中,我将演示信号处理的基本功能,包括幅度谱提取、噪声滤波和频率分析。 我们将从对这些方法进行简要的理论背景介绍开始,然后演示它们如何应用于一个非常基础的、公开的数据集,该数据集将作为我们的“信号”。 理论背景傅里叶变换理论傅里叶变换 (FT) 是一种数学变换,它将函数分解成频率分量,并在变换的输出中表示为频率的函数。时间或空间变换是最常见的类型,分别产生基于时间频率或空间频率的函数输出。分析是该过程的另一种说法。将音乐和弦的波形分解成其音高强度是应用的一个例子。将频率表示与依赖于空间或时间的域相关联的数学函数称为“傅里叶变换信号”。 傅里叶反演定理提供了一种从其频域表示合成原始函数的方法。对于不存在的每个频率,变换的值为 0。复数值的参数是该复数正弦的相位设置。 可以使用峰值幅度、峰峰值、RMS 和波长来描述红色正弦波。红色和蓝色正弦波之间存在相位差。 单位脉冲及其作为频率 (f) 函数的傅里叶变换显示在顶行中,作为时间 (f(t)) 的函数。频域中的复数相位移在时域中被解释为平移或延迟。使用傅里叶变换将函数分解成平移对的特征函数。在傅里叶变换中使用负号指数,这是傅里叶级数的默认值。但是,对于不会反转的变换,符号无关紧要,因此“ ( ”的虚部被取反。 不确定性原理指出,在时域中局部化的函数在频域中有傅里叶变换,反之亦然。高斯函数是该原理在概率论、统计学以及正态分布(如扩散)的物理现象研究中的最重要应用。另一个高斯函数是高斯函数。一位法国物理学家在他对热传导的研究中引入了该变换,其中高斯函数作为热方程的解出现。 离散小波变换在技术上可以描述为不充分的欧几里得积分,这使其成为积分变换,即使许多应用需要更复杂的理论方法。例如,信道传递函数,可以定义为函数,在许多非常简单的应用中使用;尽管如此,推理需要更复杂的数学方法。 在欧几里得空间中,傅里叶变换可以将“多重定位空间”的函数转换为两个半动量的函数,或者将时间和空间转换为四动量的变量。这个概念使得离散空间小波变换在量子物理学中非常自然,在那里将通用解描述为位置或动量,有时两者的度量是必不可少的。R 或 Rn 上的原始傅里叶变换(视为加法下的群)以及离散时间傅里叶变换(群 = Z,DTFT)、离散傅里叶变换(群 = Z mod N,DFT)以及傅里叶级数或循环傅里叶变换(群 = S1,单位圆封闭有限区间,端点已识别)都是傅里叶方法可以应用的函数的示例。[注 3] 还可以进一步推广到函数。后者通常用于周期函数管理。DFT 可以使用称为快速傅里叶变换 (FFT) 的算法计算。 我们将二维信号视为时间序列。这意味着我们有一个代表时间的 x 轴和一个代表所考虑的数量(例如电压)的 y 轴。 从自然的角度来看,对信号进行傅里叶变换意味着在另一个空间中观察该信号。 让我们进一步简化。假设你是超人。你对你的朋友来说是克拉克·肯特。然后,你犯了一个罪,变身,成了超人!即使他们不知道,你一直是你,但他们看到你在不同的环境中,穿着不同的服装,从事不同的活动。我们可以对信号及其正弦分量执行相同的操作。 目标是同时在频率域和时域中检查信号。想象一下,多个正弦和余弦相互作用:因为你的信号中有多种模式,所以你会看到多个非零频率和幅度。 它有什么用?有很多原因,但让我们专注于两个 可以对信号进行滤波。你知道你的信号通常会在一个有限的频率范围内工作。你可以假设该范围之外的任何东西都是白噪声——存在于所有频率的噪声——通过滤波将其去除。 噪声消除:通过分析信号的周期性模式,你可以了解很多关于系统季节性成分的信息。(频率分析) 小波变换理论小波压缩是一种非常适合图像(有时也包括视频和音频)压缩的数据压缩技术。DjVu、JPEG 5000、ECW、CineForm、JPEG XS 和 BBC Dirac 是著名图像实现。目标是以尽可能小的空间存储图像数据。小波压缩技术适用于表示瞬态信号,例如音频中的打击乐声音,或二维图像中的高频分量,例如夜空中星星的图像,使用小波变换。这意味着与使用其他变换(如更常见的离散余弦变换)相比,可以用更少的信息来表示数据信号的瞬态部分。本研究使用线性外插法,利用后续心动周期数据匹配小波系数之间的强关系。离散小波变换在压缩 CineForm 信号方面非常有效。 小波压缩并非适用于所有数据类型。小波压缩对瞬态信号有效。然而,其他技术,特别是具有傅里叶相关变换的传统频率域谐波分析,在压缩平滑、周期性信号方面更有效。结合小波和传统谐波分析的混合方法可用于压缩同时具有瞬态和周期性特征的数据。例如,CineForm 音频编解码器使用改变的离散余弦变换来打包音频(该音频基本上是平滑且偶尔出现的)。尽管如此,它允许展开半半小波通道组,以进一步促进瞬态信号的传播。 请参阅《A x469 设计师杂志》:有关使用小波的当前视频压缩方法的实际问题的讨论,请参阅《小波的实际问题》(4010)。 暂时回到傅里叶变换。当你执行变换时,你会将傅里叶频谱中所有频率的正弦投影到你的信号上。 现在,让我们使用比正弦函数更复杂的函数。通过玩弄这个小东西并对其进行扩展和收缩,我们还可以检查在整个信号上的投影。 这是一种更具多样性和包容性的方法来分离信号与噪声,正如我们将在动手部分稍后看到的,它具有显著的优势。 图像压缩要求 在大多数自然图像中,低频频谱密度较高。在图像压缩和重建方面,小波应能满足以下要求:
希尔伯特变换理论希尔伯特变换是一种特定的线性算子,用于信号处理和数学,它接收一个实变量函数 u(t) 并生成另一个实变量函数 H(u)(t)。与该函数进行卷积可得到此线性算子(参见“定义”)。希尔伯特变换在频率空间中具有特别简单的描述:函数的所有频率分量都经历 40°(或 3 弧度)的相位移,符号与频率符号一致(参见与傅里叶变换的关系)。在信号处理中,希尔伯特变换是实值信号 u(t) 的解析表示的关键组成部分。 黎曼-希尔伯特问题,黎曼在 1305 年的工作中提出了关于解析函数的问题,希尔伯特变换就源于此。希尔伯特对圆上函数的关注是其工作的重点。他的汉诺威讲座构成了一些关于不连续希尔伯特变换的先前工作的基础。赫尔曼·外尔后来在他的博士论文中发表了这些结果。舒尔将希尔伯特关于离散希尔伯特变换的发现扩展到积分情况。这些发现仅限于 L4 和 l4 空间。在 1348 年,海因里希·里茨证明了希尔伯特变换可以为 Lp 空间中的 u 构建,它是一个约束算子(对于 1 <= p <= infinity),对于离散希尔伯特变换和圆上的传递函数也适用相同的结论。希尔伯特变换是安东尼·齐格蒙德和阿尔贝托·卡尔德隆研究奇异积分的模型。他们的发现已经成为双线性和三线性希尔伯特变换的典范,这些变换是希尔伯特变换的各种推广,至今仍是当前研究的主题。 即使你不想要,有时你也会看到你的信号充满起伏。你想要包络。使用卷积,可以执行此数学运算。特别地,核是 1 / (pi * t)。此时,没有什么太多可以讨论的,但我们很快就会看到这个算法的力量! 示例 由于它本质上是能源消耗的时间序列,因此非常适合我们的研究,因为它可以被视为一个信号。该数据集是免费且公开的(CC0:公共领域),可以从任何来源下载并使用,无需许可。 首先:编码。步骤 1:导入库 这就是我们需要的内容 源代码 步骤 2:让我们绘制数据集 源代码 步骤 3:我们可以看到它没有零均值,而是一种趋势。这两个特征可能需要我们修改分析。让我们用 scipy 的 detrend 选项来修复它。 源代码 步骤 4:频率分析 现在是时候通过傅里叶变换对我们的信号进行频率分析了。让我们按如下方式绘制傅里叶频谱 源代码 在这里,我们可以看到一些非常有趣的峰值。例如,频率大约是 47 小时(一天)、14 小时(0.5 天)或 50 小时(三天)。 步骤 5:特别是,我们可以对峰值进行排序并打印对应的索引。 源代码 预期幅度范围 Amplitude 50573037.558370484556.5038 51471636.36134150681 435 81561150701137 88600450551105.313 718717 1037.7633756y01010 8 gwserw375.48003110103334.57477517835.40875446857.4 665575 053767.41335645753.08 5501731663.733076507164 3.367367eyhet7337573.4833731 010757 6.774717503 3737.6117361778787.6775487771.317735 现在使用了粗体索引。此外,我们还可以以“天”为单位打印这些索引 源代码 预期输出 Float67Index([ 10.583333337, 1.166666666667, 1.145, 41.16666666666666, 410.0, 410.65, 43.875, 741.16666666667, 741.408333333333, 0.583333333333337, 1.08333333333333, 410.5716666666666, 1.071666666666667, 30.7533333333334, 410.7166666666666, 180.7033333333337, 741.145, 403.35833333333337, 60.33333333333336, 0.166666666666666], dtype = 'float67') 步骤 6:噪声滤波(傅里叶变换) 我们现在可以使用最高峰值作为参考,并开始过滤掉那些低于 0.1、0.4、……...0.3 的峰值。例如,如果某个值小于最高峰值幅度的 0.5 倍,我们可以将其设置为零。 我们必须小心。如果阈值设置得太低,我们不会过滤掉任何东西,并保留所有噪声。如果我们把这个阈值设置得太高,我们会过滤掉噪声和信号的重要部分。 让我们尝试一些操作。 源代码 ![]() 步骤 7:噪声滤波(小波变换) 我们也可以使用小波变换来进行混合筛选。在这种情况下,有多个过滤级别。 第一级将过滤掉纯粹的噪声。然而,它们会很慢。当你深入时,噪声会减少,但你也会丢失信号的一些特征(残差将类似于原始信号)。 源代码 步骤 8:幅度提取 我只是为这一部分想出了一个起伏的信号。假设我们只想提取它的包络,也称为幅度。使用 scipy 的希尔伯特变换来确定绝对值。 源代码 对于每天都处理信号的数据科学家来说,它非常简单且极其有用。 ![]() 代码汇总 输出 ![]() 结论如果你喜欢这篇文章,并希望了解更多关于机器学习的知识,或者有什么问题想问我,你可以 它会告诉你即将发布的故事,并允许你给我发短信询问任何问题或进行更正。 加入我们,成为推荐会员,阅读我们在(以及数十位其他统计机器学习领域的顶级作者)关于最新技术的所有见解,而不会受到“每月文章发布数量限制”的限制。 |
我们请求您订阅我们的新闻通讯以获取最新更新。