STFT (短时傅立叶变换)

短时傅立叶变换 (STFT) 详细介绍

1. 基本概念

傅立叶变换(Fourier Transform)用于将一个信号从时间域转换到频率域,然而它假设信号是平稳的,这意味着信号的频率成分在整个时间上是不变的。对于非平稳信号,傅立叶变换无法提供信号随时间变化的频率信息。

短时傅立叶变换通过将信号分割成多个短的、重叠的时间窗口,每个窗口内的信号近似为平稳的,然后对每个窗口分别进行傅立叶变换,从而获得信号在不同时刻的频率信息。

2. 数学表达

  • STFT的基本思想是将信号分割成多个小的时间窗口,在每个窗口内假设信号是平稳的,然后对每个窗口内的信号进行傅立叶变换。其数学表达式为:

    X ( t , f ) = ∫ − ∞ ∞ x ( τ ) w ( t − τ ) e − j 2 π f τ d τ X(t, f) = \int_{-\infty}^{\infty} x(\tau) w(t - \tau) e^{-j2\pi f \tau} \, d\tau X(t,f)=x(τ)w(tτ)ej2πfτdτ

    其中:

    • x ( τ ) x(\tau) x(τ) 是原始信号。
    • w ( t − τ ) w(t - \tau) w(tτ) 是窗口函数。
    • e − j 2 π f τ e^{-j2\pi f \tau} ej2πfτ 是傅立叶变换的核函数。

STFT 结果

STFT 的计算结果通常是一个复数矩阵,这个矩阵描述了信号在不同时间和频率上的特性。具体来说,STFT 结果的每个元素都是一个复数,表示信号在某个时间段和频率上的振幅和相位。下面是对这些信息的详细解释:

1. 复数矩阵表示

STFT 结果是一个复数矩阵 (Z_{xx}(t, f)),其中 (t) 表示时间,(f) 表示频率。每个元素 (Z_{xx}(t, f)) 是一个复数,包含了信号在时间 (t) 和频率 (f) 上的振幅和相位信息。

2. 幅度 (Magnitude)

复数矩阵中的每个元素的模值表示信号在该时间点和频率上的振幅(或强度)。振幅的计算公式为:

∣ Z x x ( t , f ) ∣ = Re ( Z x x ( t , f ) ) 2 + Im ( Z x x ( t , f ) ) 2 |Z_{xx}(t, f)| = \sqrt{\text{Re}(Z_{xx}(t, f))^2 + \text{Im}(Z_{xx}(t, f))^2} Zxx(t,f)=Re(Zxx(t,f))2+Im(Zxx(t,f))2

其中,(\text{Re}(Z_{xx}(t, f))) 和 (\text{Im}(Z_{xx}(t, f))) 分别表示复数矩阵的实部和虚部。

3. 相位 (Phase)

复数矩阵中的每个元素的角度值表示信号在该时间点和频率上的相位。相位的计算公式为:

∠ Z x x ( t , f ) = atan2 ( Im ( Z x x ( t , f ) ) , Re ( Z x x ( t , f ) ) ) \angle Z_{xx}(t, f) = \text{atan2}(\text{Im}(Z_{xx}(t, f)), \text{Re}(Z_{xx}(t, f))) Zxx(t,f)=atan2(Im(Zxx(t,f)),Re(Zxx(t,f)))

1. 时频图 (Spectrogram)

时频图是通过短时傅立叶变换(STFT)得到的,显示信号在时间和频率上的变化情况。它的横轴表示时间,纵轴表示频率,颜色或亮度表示信号在不同时间和频率上的强度。

生成方法

时频图通过对信号进行STFT得到。STFT将信号分割成多个短时间片段,在每个片段上进行傅立叶变换,得到每个时间点上的频率成分。

示例代码

以下是使用Python生成时频图的示例代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import stft# 生成一个示例信号:两个不同频率的正弦波
fs = 1000  # 采样频率
t = np.arange(0, 2, 1/fs)
x = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)# 计算STFT
f, t, Zxx = stft(x, fs, nperseg=256)# 绘制时频图
plt.pcolormesh(t, f, np.abs(Zxx), shading='gouraud')
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar(label='Magnitude')
plt.show()

2. 幅度谱 (Magnitude Spectrum)

幅度谱显示信号在每个时间点上的频率强度,即信号在频域的能量分布。幅度谱由STFT的结果的模值计算得到。

计算方法

幅度谱的计算公式为:

∣ X ( t , f ) ∣ = Re ( X ( t , f ) ) 2 + Im ( X ( t , f ) ) 2 |X(t, f)| = \sqrt{\text{Re}(X(t, f))^2 + \text{Im}(X(t, f))^2} X(t,f)=Re(X(t,f))2+Im(X(t,f))2

其中, Re ( X ( t , f ) ) \text{Re}(X(t, f)) Re(X(t,f)) Im ( X ( t , f ) ) \text{Im}(X(t, f)) Im(X(t,f)) 分别表示STFT结果的实部和虚部。

示例代码

下面是从STFT结果中提取并绘制幅度谱的示例代码:

# 计算幅度谱
magnitude_spectrum = np.abs(Zxx)# 绘制幅度谱
plt.pcolormesh(t, f, magnitude_spectrum, shading='gouraud')
plt.title('Magnitude Spectrum')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar(label='Magnitude')
plt.show()

3. 相位谱 (Phase Spectrum)

相位谱显示信号在每个时间点上的相位信息,相位谱表示信号在不同频率上的相位变化。相位谱由STFT的结果的角度值计算得到。

计算方法

相位谱的计算公式为:

∠ X ( t , f ) = atan2 ( Im ( X ( t , f ) ) , Re ( X ( t , f ) ) ) \angle X(t, f) = \text{atan2}(\text{Im}(X(t, f)), \text{Re}(X(t, f))) X(t,f)=atan2(Im(X(t,f)),Re(X(t,f)))

示例代码

以下是从STFT结果中提取并绘制相位谱的示例代码:

# 计算相位谱
phase_spectrum = np.angle(Zxx)# 绘制相位谱
plt.pcolormesh(t, f, phase_spectrum, shading='gouraud')
plt.title('Phase Spectrum')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar(label='Phase (radians)')
plt.show()

4. 窗口函数

常用的窗口函数包括:

  • 矩形窗:简单但频谱泄漏严重。
  • 汉宁窗:减少频谱泄漏,适用于大多数应用。
  • 海明窗:与汉宁窗相似,但具有稍微不同的频谱特性。
  • 高斯窗:具有良好的时频局部化特性。

窗口长度的选择通常是一个折中:窗口过长会导致频率分辨率高但时间分辨率低;窗口过短则时间分辨率高但频率分辨率低。

4.1 矩形窗 (Rectangular Window)

矩形窗是最简单的窗口函数,定义为在窗口长度内取1,其余为0。其数学表达式为:

w ( t ) = { 1 if  ∣ t ∣ ≤ T 2 0 otherwise w(t) = \begin{cases} 1 & \text{if } |t| \leq \frac{T}{2} \\ 0 & \text{otherwise} \end{cases} w(t)={10if t2Totherwise

其中 T T T 是窗口长度。

优点

  • 计算简单。

缺点

  • 频谱泄漏严重,频率分辨率低。
4.2 汉宁窗 (Hanning Window)

汉宁窗是常用的余弦窗之一,具有良好的频谱特性。其数学表达式为:

w ( t ) = 0.5 ( 1 − cos ⁡ ( 2 π t T ) ) , t ∈ [ 0 , T ] w(t) = 0.5 \left(1 - \cos\left( \frac{2\pi t}{T} \right) \right), \quad t \in [0, T] w(t)=0.5(1cos(T2πt)),t[0,T]

优点

  • 频谱泄漏较少,适用于大多数应用。

缺点

  • 有一定的主瓣宽度,影响频率分辨率。
4.3 海明窗 (Hamming Window)

海明窗与汉宁窗类似,但其加权系数略有不同。其数学表达式为:

w ( t ) = 0.54 − 0.46 cos ⁡ ( 2 π t T ) , t ∈ [ 0 , T ] w(t) = 0.54 - 0.46 \cos\left( \frac{2\pi t}{T} \right), \quad t \in [0, T] w(t)=0.540.46cos(T2πt),t[0,T]

优点

  • 减少了频谱泄漏,性能与汉宁窗相近。

缺点

  • 主瓣宽度稍大,频率分辨率略低。
4.4 高斯窗 (Gaussian Window)

高斯窗是一种具有良好时频局部化特性的窗函数。其数学表达式为:

w ( t ) = e − 1 2 ( t σ ) 2 , t ∈ [ − T / 2 , T / 2 ] w(t) = e^{-\frac{1}{2}\left(\frac{t}{\sigma}\right)^2}, \quad t \in [-T/2, T/2] w(t)=e21(σt)2,t[T/2,T/2]

其中 σ \sigma σ 是标准差,决定了窗口的宽度。

优点

  • 优异的时频局部化特性,适用于需要高时频分辨率的应用。

缺点

  • 计算复杂度较高。
4.5 布莱克曼窗 (Blackman Window)

布莱克曼窗是另一种常用的余弦窗,具有更低的频谱泄漏。其数学表达式为:

w ( t ) = 0.42 − 0.5 cos ⁡ ( 2 π t T ) + 0.08 cos ⁡ ( 4 π t T ) , t ∈ [ 0 , T ] w(t) = 0.42 - 0.5 \cos\left( \frac{2\pi t}{T} \right) + 0.08 \cos\left( \frac{4\pi t}{T} \right), \quad t \in [0, T] w(t)=0.420.5cos(T2πt)+0.08cos(T4πt),t[0,T]

优点

  • 较低的频谱泄漏。

缺点

  • 主瓣宽度较大,频率分辨率较低。

5. 窗口长度选择

窗口长度的选择通常是一个折中问题:窗口越长,频率分辨率越高,但时间分辨率越低;反之,窗口越短,时间分辨率高但频率分辨率低。因此,在实际应用中,需根据信号的特性和具体分析需求选择合适的窗口长度。

例如,在语音信号处理中,通常选择20-40ms的窗口长度,因为语音信号在这个范围内可以认为是平稳的。而在快速变化的生物医学信号处理中,可能需要更短的窗口以捕捉快速变化的特征。

频谱泄漏、主瓣与频率分辨率

1. 频谱泄漏 (Spectral Leakage)

频谱泄漏是指信号的频率成分在进行傅立叶变换后,其能量扩散到邻近频率的现象。频谱泄漏的产生是因为在有限时间窗口内截取信号,导致截取的信号边界不连续,从而在频率域上产生不期望的能量分布。

原因
  • 窗口函数的选择:不同的窗口函数会对频谱泄漏有不同程度的影响。
  • 窗口长度:较短的窗口可能导致更严重的频谱泄漏。
影响
  • 频率分辨率降低,频率成分难以区分。
  • 频谱图中出现伪频率成分,增加了解读的难度。
解决方法
  • 选择适当的窗口函数(如汉宁窗、海明窗)以减少频谱泄漏。
  • 适当增加窗口长度。

2. 主瓣 (Main Lobe) 和 旁瓣 (Side Lobe)

在使用窗口函数对信号进行傅立叶变换时,频谱的幅度响应通常包含一个主瓣和多个旁瓣。

主瓣

主瓣是窗口函数频谱响应的中心部分,包含信号主要的频率成分。主瓣宽度越窄,频率分辨率越高。

旁瓣

旁瓣是主瓣两侧较小的频率响应部分,旁瓣越高,频谱泄漏越严重。

关系
  • 主瓣宽度:决定了信号的频率分辨率。
  • 旁瓣高度:影响频谱泄漏的程度,旁瓣越低,频谱泄漏越少。

3. 频率分辨率 (Frequency Resolution)

频率分辨率是指在频谱分析中能够区分出两个相邻频率成分的能力。频率分辨率由窗口函数的主瓣宽度决定,主瓣越窄,频率分辨率越高。

计算

频率分辨率通常表示为频谱中的频率间隔,可以通过以下公式计算:

Δ f = 1 T \Delta f = \frac{1}{T} Δf=T1

其中, T T T 是时间窗口的长度。

4. 举例说明

考虑一个时间长度为 T T T 的信号 x ( t ) x(t) x(t),进行傅立叶变换时使用不同的窗口函数:

  • 矩形窗:主瓣较窄,但旁瓣较高,频谱泄漏严重。
  • 汉宁窗:主瓣适中,旁瓣较低,频谱泄漏相对较少。
  • 高斯窗:主瓣较窄且旁瓣较低,频谱泄漏最少,但计算复杂度高。

5. 图示说明

下面是使用Python和Matplotlib绘制的示例图,用于展示不同窗口函数的频谱响应:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import get_window# 定义窗口函数
windows = ['rectangular', 'hann', 'hamming', 'gaussian']
window_lengths = 256
fs = 1000  # 采样频率# 绘制不同窗口函数的频谱响应
plt.figure(figsize=(10, 6))
for window in windows:if window == 'gaussian':w = get_window(('gaussian', 7), window_lengths)else:w = get_window(window, window_lengths)W = np.fft.fft(w, 1024)W = np.fft.fftshift(W)freq = np.linspace(-fs/2, fs/2, len(W))plt.plot(freq, 20 * np.log10(np.abs(W) / np.max(np.abs(W))), label=window)plt.title('Window Functions Frequency Response')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude (dB)')
plt.legend()
plt.grid()
plt.show()

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

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

相关文章

抖音bd-ticket-guard-ree-public-key

上次的文章里说到bd-ticket-guard-ree-public-key是根据rsa生成私钥1跟公钥1里的私钥1通过函数加密得到的。 最近我发现那个加密函数的加密原理是通过私钥1再用不同的rsa算法生成一对小的hex后的私钥2跟公钥2,私钥2比公钥2短,然后bd-ticket-guard-ree-p…

推荐一款AI音乐生成工具和一款浏览器

大家好,今天给大家带来2款软件,一款是移动浏览器,一款是AI音乐生成软件。 Alook Alook是一款移动端浏览器,它以其独特的无广告、无推送、无新闻的"三无"特性,为用户提供了一个清爽的上网环境。Alook不仅界…

构建LangChain应用程序的示例代码:25、LangChain中的FakeListLLM类使用指南

LangChain中的FakeListLLM类使用指南 LangChain提供了一个fake LLM类,可以用于测试。这允许您模拟LLM的调用,并模拟如果LLM以某种方式响应会发生什么。 在这个笔记本中,我们将介绍如何使用它。 我们首先在代理中使用FakeLLM。 from langc…

rust的类型转换和一些智能指针用法(四)

基础类型 使用 as 关键字:用于基本数值类型之间的转换,例如将 i32 转换为 u32。 例子:let x: i32 10; let y: u64 x as u64; 使用标准库中的转换方法:如 from() 和 into() 方法,这些方法通常用于无风险的转换&#…

11本AI人工智能相关电子书推荐(带下载地址)

1. 《生命3.0》 电子书链接:百度网盘 请输入提取码 提取码: vxnw 2. 《千脑智能》 电子书链接: 百度网盘 请输入提取码 提取码: we8u 3. 《AI 3.0》 电子书链接: 百度网盘 请输入提取码 提取码: nwu4 4. 《元宇宙与数字经济》 电子书链接…

【算法小记】深度学习——时间序列数据分析 Time series Data Analysis

在本篇博客中将简单介绍常见的几种循环神经网络和一维卷积神经网络,并使用一些简答的数据进行拟合分析。本文相对适合刚入门的同学,同时也作为自己过去一段时间学习的总结和记录,现在神经网络框架已经非常完善的支持了很多常见和有效的深度学…

【优选算法】BFS解决FloodFill算法

一、经验总结 什么是FloodFill算法? FloodFill算法是一种用于填充连通区域的算法,通常用于图像处理和计算机图形学中。它从给定的起始点开始,向周围相邻的像素进行扩散填充,直到遇到边界或者其他指定条件停止。 FloodFill算法还…

TCP/IP 接收发送缓存大小的自动调优 Auto Tuning

内部机制已实现自动调整缓存大小。参考Tuning the network。 1. net.ipv4.tcp_moderate_rcvbuf 是 Linux 内核的一个参数,用于控制 TCP 接收缓冲区大小的自动调整。 当这个参数被激活时,Linux 内核会根据当前网络条件自动调整 TCP 接收缓冲区的大小,以优化网络性能。它会根…

新买的移动硬盘无法识别

文章目录 背景解决方案 背景 同事新买的移动硬盘,插在电脑上识别不出来盘符,检查了一下,硬盘没问题应该,是ssk的硬盘盒M.2的SSD,硬盘驱动也是正常的,插拔了几次,都不识别,换了太电脑…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

深度学习 - softmax交叉熵损失计算

示例代码 import torch from torch import nn# 多分类交叉熵损失,使用nn.CrossEntropyLoss()实现。nn.CrossEntropyLoss()softmax 损失计算 def test1():# 设置真实值: 可以是热编码后的结果也可以不进行热编码# y_true torch.tensor([[0, 1, 0], [0, 0, 1]], dt…

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中,我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明,不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…

【云岚到家】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址:https://arxiv.org/pdf/1506.02640 训练集博客链接:目标检测实战篇1——数据集介绍(PASCAL VOC,MS COCO)-CSDN博客 代码文件:在我资源里,但是好像还在审核,大家可以先可以,如果没有的…

从 Android 恢复已删除的备份录

本文介绍了几种在 Android 上恢复丢失和删除的短信的方法。这些方法都不能保证一定成功,但您可能能够恢复一些短信或其中存储的文件。 首先要尝试什么 首先,尝试保留数据。如果你刚刚删除了信息,请立即将手机置于飞行模式,方法是…

【Linux】信号(二)

上一章节我们进行了信号产生的讲解。 本节将围绕信号保存展开,并会将处理部分开一个头。 目录 信号保存:信号的一些概念:关于信号保存的接口:sigset_t的解释:对应的操作接口:sigprocmask:sigp…

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中,Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态,而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件,其中子视图需要向父…

Git 和 Github 的使用

补充内容:EasyHPC - Git入门教程【笔记】 文章目录 常用命令配置信息分支管理管理仓库 概念理解SSH 密钥HTTPS 和 SSH 的区别在本地生成 SSH key在 Github 上添加 SSH key 使用的例子同步本地仓库的修改到远程仓库拉取远程仓库的修改到本地仓库拉取远程仓库的分支并…

千益畅行:合法合规的旅游卡服务,真实可靠的旅游体验

近期,关于千益畅行旅游卡服务的讨论引起了广泛关注。然而,网络上出现了一些对其误解和质疑的声音。为了澄清事实,我们深入了解了千益畅行的运营模式和业务特点,发现它是一家合法合规的旅游卡服务提供商,为消费者提供真…

Eslint配置指南

1. Eslint配置指南 1.1. 安装 ESLint1.2. 生成配置文件1.3. 修改配置文件1.4. 创建 .eslintignore 文件1.5. 运行 ESLint1.6. 整合到编辑器/IDE1.7. 自动修复 2. 配置prettier 2.1. 安装依赖包2.2. .prettierrc.json添加规则2.3. .prettierignore忽略文件2.4. 保存自动格式化 3…