音频概念_STFT_窗口函数

短时傅里叶变换 (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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务网关——Go令牌桶限流】

1. time/rate限速器使用 令牌桶限流算法rate.NewLimiter(limit,burst)产生一个新的限速器 limit表示每秒产生token数、burst表示最多存token数 Allow判断当前是否可以取到tokenWait阻塞等待直到取到tokenReverse返回等待时间(预估的等待时间)&#xff0…

240626_昇思学习打卡-Day8-稀疏矩阵

240626_昇思学习打卡-Day8-稀疏矩阵 稀疏矩阵 在一些应用场景中,比如训练二值化图像分割时,图像的特征是稀疏的,使用一堆0和极个别的1表示这些特征即费事又难看,此时就可以使用稀疏矩阵。通过参考大佬博文,结合个人理…

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

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

禁止浏览器对input的自动填充和填充提示(适用于谷歌、火狐、Edge(原IE浏览器)等常见浏览器)

目录 1.要解决的问题2.一技能:原生属性,小试牛刀3.二技能:傀儡input,瞒天过海4.三技能:JavaScript出击,直接开大 写在前面: 如有转载,务必注明出处,否则后果自负。 1.要解…

Java | Leetcode Java题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution {void dfs(char[][] grid, int r, int c) {int nr grid.length;int nc grid[0].length;if (r < 0 || c < 0 || r > nr || c > nc || grid[r][c] 0) {return;}grid[r][c] 0;dfs(grid, r - 1, c);dfs(grid, r…

Pytorch实战(一):LeNet神经网络

文章目录 一、模型实现1.1数据集的下载1.2加载数据集1.3模型训练1.4模型预测 LeNet神经网络是第一个卷积神经网络&#xff08;CNN&#xff09;&#xff0c;首次采用了卷积层、池化层这两个全新的神经网络组件&#xff0c;接收灰度图像&#xff0c;并输出其中包含的手写数字&…

STM32之IIC(软件)

介绍 IIC &#xff08; 又称为 I2C 或 IC &#xff09;是一种串行通信协议&#xff0c; IIC使用两根线路来进行通信&#xff1a; 串行数据线&#xff08;SDA&#xff09; 和 串行时钟线&#xff08;SCL&#xff09; 。 SDA 线上的数据在 SCL 线的时钟信号下进行 同步传输。 主…

安宝特方案 | AR术者培养:AR眼镜如何帮助医生从“看”到“做”?

每一种新药品的上市都需要通过大量的临床试验&#xff0c;而每一种新的手术工具在普及使用之前也需要经过反复的实践和验证。医疗器械公司都面临着这样的挑战&#xff1a;如何促使保守谨慎的医生从仅仅观察新工具在手术中的应用&#xff0c;转变为在实际手术中实操这项工具。安…

centos7迁移部分成功

早闻CentOS不再维护的消息&#xff0c;确实有些遗憾&#xff0c;毕竟这个系统好用又简单&#xff0c;已经成为了我们工作中的一种习惯。然而&#xff0c;2024年6月30日这一天如约而至&#xff0c;CentOS 7停止维护后&#xff0c;随之而来的安全漏洞又该如何防范&#xff1f;系统…

Stirling-PDF 安装和使用教程

PDF (便携式文档格式) 目前已经成为了文档交换和存储的标准。然而&#xff0c;找到一个功能全面、安全可靠、且完全本地化的 PDF 处理工具并不容易。很多在线 PDF 工具存在隐私和安全风险&#xff0c;而桌面软件往往价格昂贵或功能有限。那么&#xff0c;有没有一种解决方案能够…

Linux安装JDk教程

&#x1f4d6;Linux安装JDk教程 ✅下载✅安装 ✅下载 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 123云盘&#xff1a;https://www.123pan.com/s/4brbVv-JdmWA.html ✅安装 1.上传安装包jdk-17_linux-x64_bin.tar.gz到指定位…

java易错题型(复习必看)

java易错题型&#xff1a; 下列符号中&#xff0c;哪个用于分隔throws关键字抛出的多个异常 逗号&#xff0c; Java中用来声明一个方法可能抛出某种异常的关键字是throw 对于catch子句的排列&#xff0c;下列哪种是正确的&#xff1a;子类异常在先&#xff0c;父类异常在后&a…

解决“Duplicate keys detected: ‘ ‘.This may cause an update error.”问题

问题原因 出现“Duplicate keys detected”的错误&#xff0c;通常表示在v-for指令中使的:key绑定值有重复。 如果前端是静态数据&#xff0c;一般能自我避免:key绑定值有重复。如果前端是绑定的动态数据&#xff0c;那么需要另外提供一个唯一的键。 在这个例子中&#xff0c…

CV每日论文--2024.6.26

1、StableNormal: Reducing Diffusion Variance for Stable and Sharp Normal 中文标题&#xff1a;StableNormal&#xff1a;减少扩散方差以实现稳定且锐利的法线 简介&#xff1a;本文介绍了一种创新解决方案&#xff0c;旨在优化单目彩色输入&#xff08;包括静态图片与动态…

糖与蛋白质的“隐秘对话”:DeepGlycanSite如何揭示生命之谜

在生命的复杂舞台上&#xff0c;糖类与蛋白质之间的相互作用犹如一场精心编排的舞蹈&#xff0c;其背后的每一个细微动作都可能对生物体的生理与病理过程产生深远影响。然而&#xff0c;糖类分子的多样性和复杂性&#xff0c;使得科学家们对糖-蛋白质结合位点的识别和研究充满了…

数据预处理功能教程,上传文件生成知识库 | Chatopera

如何快速的生成高质量的知识库&#xff1f; 数据预处理功能教程 | Chatopera 云服务低代码定制聊天机器人 关于 Chatopera Chatopera 云服务重新定义聊天机器人&#xff0c;https://bot.chatopera.com 定制智能客服、知识库、AI 助手、智慧家居等智能应用&#xff0c;释放创新…

图形化用户界面-java头歌实训

图形化用户界面 import java.awt.*; import javax.swing.*; public class GraphicsTester extends JFrame { public GraphicsTester() { super("Graphics Demo"); setSize(480, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint…

Node.js 个人博客

关于该博客 这是一个自己搭建的简易的博客&#xff0c;用于记录一些学习笔记和技术分享。在大四毕业时完成了第一个版本&#xff0c;后续会不断完善和更新。欢迎大家提出宝贵意见和建议。 详细介绍在 blog/posts/博客/博客搭建.md 中: https://github.com/ximingx/blog/blob/m…

php goto解密脚本源码

php goto解密脚本源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89426171 更多资源下载&#xff1a;关注我。

【Java Web】Servlet控制器

目录 一、Servlet简介 二、Servlet运行流程 三、Servlet开发流程 四、Servlet-api.jar包导入和Content-Type问题 4.1 Servlet-api.jar导入问题 4.2 Http报文头中的Content-Type属性 五、Servlet_url-pattern请求映射路径设置 5.1 url-pattern方式 5.2 注解方式配置servlet 六、…