音频概念_STFT_窗口函数

news2024/11/18 18:27:22

短时傅里叶变换 (Short-Time Fourier Transform, STFT) 是一种时频谱转换算法,它通过在时间上移动窗口函数并计算窗口内信号的频谱来获得信号在时间和频率上的信息。填充信号可以确保每个窗口都有足够的数据进行频谱计算,特别是在窗口函数的边缘。

窗口函数主要用于信号处理中的短时傅里叶变换(STFT)、滤波器设计和其他需要对信号进行窗函数处理的场景, 可减少频谱泄漏,避免傅里叶变换中的频谱混叠

1.窗口函数

让窗口内的信号序列 乘以 一个系数系列,以调整信号的取值范围,
这个系数系列来自 窗口函数

2.频谱泄漏(Spectral Leakage)

频谱泄漏是信号的能量未集中在原始频率位置,而是扩散到了其他频率位置的现象

傅里叶变换是分段的,假设每段有一个主频率信号,且信号是周期的。但时间上截断信号会影响信号原有的周期性,这种非周期性会导致频域中主频能量扩散到其他频率分量。

频谱泄漏表现在频谱图中是 信号的主要频率成分(主瓣)周围会出现一些不希望出现的频率成分(旁瓣)。这些旁瓣是由于截断或不适当的窗口函数引起的,会影响频谱的清晰度和准确性。

窗口函数可以减少这种现象,通过对窗口内信号进行系数调整,窗口两端逐渐减小到零,从而平滑过渡,减少非周期性误差,即降低频率域中的副瓣(sidelobes)。

3.频谱特征

3.1 主瓣(mainlobe)

频谱中最大的峰值区域,它代表了信号的主要频率成分,

在应用窗口函数后的频谱图中,主瓣通常位于频谱的中心位置,并包含了信号的主要能量。

主瓣宽度决定了频谱的分辨率。主瓣越窄,频谱分辨率越高,可以更好地区分相近的频率成分。

3.2 旁瓣(Sidelobe)

旁瓣是频谱中位于主瓣两侧的较小峰值区域。旁瓣表示频谱泄漏,即信号的能量扩散到主频率之外的频率分量。

旁瓣越高,频谱泄漏越严重,这会影响频谱分析的精度。

旁瓣高度决定了频谱泄漏的程度。旁瓣越低,频谱泄漏越小,频谱分析的准确性越高。

4. 填充

截断前的操作,把周期函数的 “补全” or “延续”

填充是在窗口信号的两端添加一些额外的数据,以便在进行窗口函数处理时,避免边界处的窗口截断问题 ,截断会导致边界处的能量损失和频谱伪像。

下面是将[0.1, 0.2, 0.3, 0.4, 0.5] 填充为 [0.4, 0.3, 0.2, 0.1, 0.2, 0.3, 0.4, 0.5, 0.4, 0.3, 0.2]的代码:

signal = torch.tensor([0.1, 0.2, 0.3, 0.4, 0.5]) # 模拟信号

# STFT 参数
n_fft = 8
hop_size = 2

# 对信号进行填充
padded_signal = torch.nn.functional.pad(signal.unsqueeze(0), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect')
padded_signal = padded_signal.squeeze(0)

print("原始信号长度:", len(signal)) # 5
print("填充后的信号长度:", len(padded_signal)) # 11
print(padded_signal) 
# tensor([0.4000, 0.3000, 0.2000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.4000, 0.3000, 0.2000])

5. 汉宁函数 (Hann Window)

5.1 公式

w ( n ) = 0.5 ( 1 − c o s N − 1 2 π n ​ ) w(n)=0.5(1−cos\frac{N−1}{2πn​}) w(n)=0.5(1cos2πnN1)

  • n 是窗口内的样本索引, 0 ≤ n ≤ N − 1 0 \leq n \leq N−1 0nN1

  • N是总长度,

  • w(n)是窗口函数的值, 它是一个序列,长度为N

5.2 函数特性

  • 中心对称性: w ( n ) w ˉ ( N − 1 − n ) w(n)\=w(N−1−n) w(n)wˉ(N1n)

  • 窗口的两端值为零,这有助于减小边界效应(平滑过渡,增加连续性)

  • 窗口函数在中间达到最大值

6. 代码实例:

6.1 代码1

对原始5Hz正弦波乘以汉宁窗口系数,降低旁瓣(sidelobe),拉窄主瓣(mainlobe):

结果如图:
在这里插入图片描述
旁瓣 1.0 => 0.4

主瓣 (50, 250) => (100, 200)

6.1 代码2

对一个440Hz信号转换为视频谱

  • 没有padding和window的结果:
    在这里插入图片描述

  • 有padding,无window的结果:

效果好一些,没那么多隔断部分
在这里插入图片描述

  • 有padding,有window的结果:

没有断层,特征反馈清晰
在这里插入图片描述

另外,傅里叶转换后结果是个复数,这个是复数实部的图:
在这里插入图片描述

这是复数虚部的:
在这里插入图片描述

  1. 总结和代码

频谱特性:汉宁窗口的频谱具有较低的旁瓣(sidelobe),这意味着它能够有效地抑制频谱泄漏,主瓣(mainlobe)较宽,这会降低频率分辨率。

短时傅里叶变换:STFT通过对信号进行分段,对每个片段应用汉宁窗口,能减少频谱泄漏,获得更准确的频谱信息。

代码1:

import numpy as np
import matplotlib.pyplot as plt
import torch

# 生成一个示例信号
sampling_rate = 1000
t = np.linspace(0, 1, sampling_rate, endpoint=False)
freq = 5  # 频率为5Hz的正弦波
signal = np.sin(2 * np.pi * freq * t)

# 定义窗口函数
window_size = 256
hann_window = torch.hann_window(window_size) # $w(n)=0.5(1−cos\frac{N−1}{2πn}), n \in [0, N-1]$


# 应用窗口函数
windowed_signal = signal[:window_size] * hann_window.numpy()

# 绘制信号和窗口函数
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(signal[:window_size], label="Original Signal")
plt.plot(hann_window.numpy(), label="Hanning Window")
plt.legend()
plt.title("Original Signal and Hanning Window")

plt.subplot(2, 1, 2)
plt.plot(windowed_signal, label="Windowed Signal")
plt.legend()
plt.title("Windowed Signal")

plt.tight_layout()
plt.show()

代码2:

# STFT 参数
n_fft = 2048
hop_size = 512
win_size = 2048 # 窗口长度

# 模拟音频信号
sampling_rate = 16000
t = np.linspace(0, 1, sampling_rate)
freq = 440  # 频率为440Hz的正弦波
y = torch.tensor(np.sin(2 * np.pi * freq * t)).float()

# 生成汉宁窗口
hann_window = torch.hann_window(win_size)

# 对信号进行填充
y = torch.nn.functional.pad(y.unsqueeze(0), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') # [17536]
y = y.squeeze(0)
print(y.shape)

# ------------------计算 STFT-1
spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, 
    window=hann_window, center=True, pad_mode='reflect', normalized=False, 
    onesided=True, return_complex=True)
print(spec.shape)  # torch.Size([1025, 35]), 查看STFT结果的形状

# 转换为频谱幅度
#real = spec.real # 实部
#imag = spec.imag # 虚部
#spec_magnitude = torch.sqrt(real**2 + imag**2).numpy()
spec_magnitude = spec.abs()
print(spec)

#绘制频谱图
plt.figure(figsize=(10, 6))
plt.imshow(20 * np.log10(spec_magnitude + 1e-6), aspect='auto', origin='lower', extent=[0, t[-1], 0, sampling_rate / 2])
plt.colorbar(format='%+2.0f dB')
plt.title("STFT Magnitude Spectrogram")
plt.xlabel("Time [s]")
plt.ylabel("Frequency [Hz]")
plt.show()

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

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

相关文章

读AI新生:破解人机共存密码笔记13有益机器

1. 标准模型 1.1. 我们能控制一个从外太空来的超级智能实体的概率几乎为零 1.2. 随着根据标准模型设计的机器变得更加智能,以及它们的行动范围遍及全球,关闭机器这种方法越来越不可行 1.2.1. 机器将会追求它们自己的目标,无论目标错得多么…

通讯:单片机串口和电脑通讯

目录 1.串口输出数据到电脑 硬件部分 串口输出数据到电脑的软件软件部分: 相关问题: 2.单片机串口--485--485转USB--电脑 串口,芯片,转换器,设备之间的通讯的接线,都是要TX--RX, RX--TX 交叉连接。 单…

机器学习Python代码实战(二)分类算法:k-最近邻

一.k-最近邻算法步骤 1.选择适当的k值。它表示在预测新的数据点时要考虑的邻居数量。 2.计算距离。计算未知点与其他所有点之间的距离。常用的距离计算方法主要有欧氏距离,曼哈顿距离等。 3.选择邻居。在训练集中选择与要预测的数据点距离最近的k个邻居。 4.预测…

如何快速把一篇文章或企业介绍变为视频?

随着科技和数字化的不断发展,企业的营销手段也在不断变革。尤其对于产品宣传来说,用生动的视觉语言直观地展示产品特点和优势,能够彰显企业实力,让社会不同层面的人士对企业产生正面、良好的印象,从而建立对该企业的好…

Antivirus Zap Pro :苹果 mac 电脑全面的系统安全解决方案

Antivirus Zap Pro 是一个全面的系统安全解决方案,它可以扫描和删除 Mac 中的恶意软件和其他恶意软件,还可以检测 Mac 上已经存在的威胁或可疑文件,并保护您的 Mac 免遭日后的威胁,满足用户不同的 Mac 电脑杀毒需求,有…

【01BFS】2290. 到达角落需要移除障碍物的最小数目

本文涉及知识点 01BFS CBFS算法 图论知识汇总 LeetCode2290. 到达角落需要移除障碍物的最小数目 给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一: 0 表示一个 空 单元格, 1 表示一个可以移除的…

聚观早报 | 小鹏MONA M03曝光;iPhone 16系列电池改进

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月25日消息 小鹏MONA M03曝光 iPhone 16系列电池改进 一加Ace 3 Pro三款配色 字节跳动与博通合作开发AI芯片 蚂…

GPT-5

欢迎来到 Papicatch的博客 文章目录 🍉技术突破预测 🍈算法进步 🍈理解力提升 🍈行业推动力 🍉人机协作的未来 🍈辅助决策 🍈增强创造力 🍈复杂任务中的角色 🍈人…

非极大值抑制算法(Non-Maximum Suppression,NMS)

https://tcnull.github.io/nms/ https://blog.csdn.net/weicao1990/article/details/103857298 目标检测中检测出了许多的候选框,候选框之间是有重叠的,NMS作用重叠的候选框只保留一个 算法: 将所有候选框放入到集和B从B中选出分数S最大的b…

Hadoop3:Yarn框架的三种调度算法

一、概述 目前,Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.1.3默认的资源调度器是Capacity Scheduler。 CDH框架默认调度器是Fair Scheduler。 …

Http客户端-Feign 学习笔记

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

EVPN-VXLAN:如何在数据中心使用

移动设备的迅速普及、社交媒体和协作工具的使用不断增加,使得网络中的端点数量日益增多。这种端点的快速增长促使对更有效的分段策略的需求,以区分不同用户、设备和流量类型。EVPN-VXLAN通过在物理第3层底层网络建立第2层覆盖虚拟网络的隧道,…

VMware虚拟机安装CentOS7.9 Oracle 11.2.0.4 RAC+单节点RAC ADG

目录 一、参考资料 二、RAC环境配置清单 1.主机环境 2.共享存储 3.IP地址 4.虚拟机 三、系统参数配置 1. 配置网卡 1.1 配置NAT网卡 1.2 配置HostOnly网卡 2. 修改主机名 3. 配置/etc/hosts 4. 关闭防火墙 5. 关闭Selinux 6. 配置内核参数 7. 配置grid、oracle…

SSI 注入漏洞

0x00漏洞描述 SSI 英文是 Server Side Includes 的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI 就是在 HTML 文件中,可以通过注入注释调用的命令或指针。SSI 具有强大的功能,只要使用一条简单的 SSI 命令就可以实…

Ubuntu挂载window的网络共享文件夹爱

1.进入win10创建一个用户smb密码也是smb 2.右键进入文件夹共享 3.进入Ubuntu安装支持cifs-utils sudo apt update sudo apt install cifs-utils 4.sudo mkdir /mnt/shared 5.挂载: sudo mount -t cifs -o usernamesm bpasswordsmb //172.16.11.37(windowsIP)/s…

结构体(二)

今天来继续介绍我们有关结构体的相关知识 结构体的自引用 结构体的自引用,顾名思义嘛,就是在我们的结构体中再次引用该结构体,这一点跟我们的函数递归有异曲同工之妙,不了解函数递归的小伙伴可以移步到我之前做过的一期&#xf…

ElasticSearch索引架构与存储

关于ES官网的介绍: Elasticsearch provides near real-time search and analytics for all types of data. Whether you have structured or unstructured text, numerical data, or geospatial data, Elasticsearch can efficiently store and index it in a way that support…

django学习入门系列之第三点《案例 商品推荐部分》

文章目录 划分区域搭建骨架完整代码小结往期回顾 划分区域 搭建骨架 /*商品图片&#xff0c;父级设置*/ .slider .sd-img{display: block;width: 1226px;height: 460px; }<!-- 商品推荐部分 --> <!--搭建出一个骨架--> <div class"slider"><di…

openwrt igmp 适配

每弄完一次&#xff0c;过不多久就忘了&#xff0c;这次决心记下来。 openwrt 的igmpproxy 包是干嘛的&#xff1f;原来&#xff0c;组播包并不能穿透路由&#xff0c;也就是我们在wan端播放的组播视频流&#xff0c;lan端是没法收到的&#xff0c;igmpproxy就是用来打通wan端…

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…