# 音频处理4_傅里叶变换

1.离散傅里叶变换

对于离散时域信号 x[n]使用离散傅里叶变换(Discrete Fourier Transform, DFT)进行频域分析。

DFT 将离散信号 x[n] 变换为其频谱表示 X[k],定义如下:

X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j 2 π k n N X[k] = \sum_{n=0}^{N-1} x[n]e^{-j\frac{2\pi kn}{N}} X[k]=n=0N1x[n]ejN2πkn

1.1 共轭对称性

对于实值信号,其离散傅里叶变换(DFT)的结果在频谱上是共轭对称性(Conjugate Symmetry)

复共轭:实数相同,虚数取反

z = a + bi, 那么 \overline{z} = a - bi

1.2 奈奎斯特频率

奈奎斯特频率(Nyquist frequency)指在采样过程中,能够精确还原原始信号的最高频率。根据奈奎斯特定理,为了正确地重建一个信号,采样频率必须至少是信号中最高频率的两倍。

因此,奈奎斯特频率就是采样频率的一半。如果信号的频谱超过了奈奎斯特频率,就会出现混叠(aliasing)现象,导致采样后的信号无法正确还原原始信号。

典型的人类语音频率范围大约在0 Hz到4 kHz之间,主要能量集中在0 Hz到2.5 kHz。

因此,为了捕捉和处理语音信号的主要频率成分,通常选择的采样频率是略大于这个最高频率(如8 kHz)。

1.3 混叠(aliasing)现象

即采样频率低于信号中最高频率的两倍,就会导致频域中的信号成分发生错位和重叠(表现为失真),从而无法正确地重建原始信号

如果采样频率低于最高频率的两倍,那么高于奈奎斯特频率的信号成分会“折叠”到采样频率范围内的其他频率位置上。

当信号频率超过了奈奎斯特频率时,它在采样后的频域中将被错误地解释为低于奈奎斯特频率的频率,这会导致信号在频域中产生额外的频率能量,这些能量是原始信号频率的镜像(或折叠)。

2.快速傅里叶变换(FFT)

FFT利用分治策略将离散傅里叶变换(DFT)分解为更小规模的DFT计算。将长度为 N 的序列分成长度为
N/2 的两个子序列,然后递归地应用FFT算法计算这两个子序列的DFT,最后将结果合并为原始序列的DFT。

  • Scipy的FFT用于可视化频域图
# 使用 scipy.fftpack.fft 计算 FFT
fft_result = fft(signal)

# 计算频率轴
freqs = np.fft.fftfreq(len(signal), d=t[1] - t[0])

3.短时傅里叶变换(STFT)

短时傅里叶变换(Short-Time Fourier Transform, STFT)用于画时频谱,
是一种将信号分解到时间-频率域的方法,

参数如下:

input (Tensor):
* 输入信号,可以是 1D 或 2D 张量。
* 如果是 1D 张量,则表示单个信号序列。
* 如果是 2D 张量,第一维表示信号的批次(batch),第二维表示每个信号的时间步。

n_fft (int):
* 每个窗口的 FFT 点数。
* 通常是一个大于等于 win_length 的值。这个参数决定了频域分辨率。

hop_length (int, optional):
* 窗口之间的跳跃长度(即窗口之间的距离)。
* 默认值为 win_length // 2,即窗口重叠一半。

win_length (int, optional):
* 每个窗口的长度。
* 默认值为 n_fft, 大于n_fft, 则需要填充窗口剩余样本点。

window (Tensor, optional):
* 窗函数,用于加窗处理,以提升频谱的平滑度。
* 通常使用汉宁窗(Hann window)或汉明窗(Hamming window)。
* 默认值为一个全 1 的窗函数。

center (bool, optional):
* 如果为 True(默认值),则在信号的两端各加上 n_fft // 2 个零,以确保每个时间点都有一个完整的窗口。

pad_mode (str, optional):
* 填充模式,当 center 为 True 时使用。
* 可以是 'constant', 'reflect' 等。默认值为 'reflect'。

normalized (bool, optional):
* 如果为 True,则返回的 STFT 会进行归一化处理。

onesided (bool, optional):
* 如果为 True(默认值),则返回的 STFT 只包含非负频率部分,这在处理实数信号时是有用的。

return_complex (bool, optional):
* 如果为 True,则返回复数类型的结果。否则,返回一个两通道的实数张量,其中一个通道是实部,另一个通道是虚部。

时频谱计算方法:

  • y 轴 (frequence bins)

n f f t / 2 + 1 = 1024 / 2 + 1 = 513 n_{fft} / 2 + 1 = 1024 / 2 + 1 = 513 nfft/2+1=1024/2+1=513

  • x 轴 (times & frames)

计算参数与方法如下:

signal_length = 16000
n_fft = 1024
win_length = 1024
hop_length = 512

1. 窗口滑动总长度 =  signal_length - win_length = 14976
2. 滑动步数 =  窗口滑动总长度 /  hop_length = 29.25
3. 时间帧数 = 滑动步数向下取整 + 1 = 30
 

4.代码样例

一个信号由两个信号叠加:

signal = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 50 * t)

上图为stft, 下图为fft
在这里插入图片描述

代码在Github_Link

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

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

相关文章

.NET 漏洞情报 | 某整合管理平台SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

揭秘Wish自养号秘诀:新手卖家如何快速出单?

对于卖家来说,如果想要提升店铺的转化率和销量,有几个关键策略是必不可少的: 一、精心挑选热销产品 成功的第一步在于选品。选择热销产品如同掌握了成功的钥匙。卖家需要深入分析平台用户群体,了解他们的需求和偏好。例如&#…

Tampermonkey 油猴脚本使用教程

Tampermonkey 油猴脚本使用教程 一、Tampermonkey 油猴脚本简介 Tampermonkey 是一款流行的浏览器扩展,它允许用户通过用户脚本增强网页功能或改变网页的外观。它支持包括 Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox 在内的多种浏览器。Tampermonkey…

【C++ 初阶路】--- C++内存管理

目录 一、C/C内存分布二、C内存管理方式2.1 new/delete操作内置类型2.2 new和delete操作自定义类型 三、operator new与operator delete函数四、new和delete的实现原理4.1 内置类型4.2 自定义类型 一、C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Tes…

大模型+多模态合规分析平台,筑牢金融服务安全屏障

随着金融市场的快速发展,金融产品和服务日趋多样化,消费者面临的风险也逐渐增加。 为保护消费者权益,促进金融市场长期健康稳定发展,国家监管机构不断加强金融监管,出台了一系列法律法规和政策文件。对于金融从业机构…

代码托管服务:GitHub、GitLab、Gitee

目录 引言GitHub:全球最大的代码托管平台概述功能特点适用场景 GitLab:一体化的开发平台概述功能特点适用场景 Gitee(码云):中国本土化的代码托管服务概述功能特点适用场景 功能对比结论 引言 在现代软件开发中&#…

Pickle, SafeTensor, GGML和GGUF

如今,大型语言模型的使用方式有以下几种: 作为 OpenAI、Anthropic 或主要云提供商托管的专有模型的 API 端点作为从 HuggingFace 的模型中心下载的模型工件和/或使用 HuggingFace 库进行训练/微调并托管在本地存储中作为针对本地推理优化的格式的模型工…

机器学习 中数据是如何处理的?

数据处理是将数据从给定形式转换为更可用和更理想的形式的任务,即使其更有意义、信息更丰富。使用机器学习算法、数学建模和统计知识,整个过程可以自动化。这个完整过程的输出可以是任何所需的形式,如图形、视频、图表、表格、图像等等&#…

Linux基础篇——目录结构

基本介绍 Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在根目录下再创建其他的目录 在Linux中,有一句经典的话:在Linux世界里,一切皆文件 Linux中根目录下的目录 具体的…

PHP留守儿童关爱之家网站-计算机毕业设计源码11079

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3 论文结构与章节安排 2 留守儿童关爱之家网站系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程和逻辑 2.5本章小结 3 留守儿童关爱之家网站总体设计 3.1系统结构设计 3.2系统功能模块设计 3.2 数…

基于SSM网上拍卖系统

设计技术: 开发语言:Java数据库:MySQL技术:SpringMybatisSpringMvc 工具:IDEA、Maven、Navicat 主要功能 管理员功能有个人中心,用户管理,卖家管理,商品类型管理,拍卖…

EDA 虚拟机 Synopsys Sentaurus TCAD 2017.09 下载

下载地址(制作不易,下载使用需付费,不能接受的请勿下载): 链接:https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取码:o03i

AI网络爬虫001:用kimichat自动批量提取网页内容

文章目录 一、准备工作二、输入内容三、输出内容一、准备工作 在网页中按下F12键,查看定位网页元素 二、输入内容 在kimi中输入提示词: 你是一个Python编程专家,要完成一个爬取网页内容的Python脚本,具体步骤如下:在F盘新建一个Excel文件:提示词.xlsx打开网页:https:…

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Linux】线程周边002之线程安全

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.Linux线程互斥 1…

Java实现日志全链路追踪.精确到一次请求的全部流程

广大程序员在排除线上问题时,会经常遇见各种BUG.处理这些BUG的时候日志就格外的重要.只有完善的日志才能快速有效的定位问题.为了提高BUG处理效率.我决定在日志上面优化.实现每次请求有统一的id.通过id能获取当前接口的全链路流程走向. 实现效果如下: 一次查询即可找到所有关…

数据分析入门指南:从基础概念到实际应用(一)

随着数字化时代的来临,数据分析在企业的日常运营中扮演着越来越重要的角色。从感知型企业到数据应用系统的演进,数据驱动的业务、智能优化的业务以及数智化转型成为了企业追求的目标。在这一过程中,数据分析不仅是技术的运用,更是…

竹云助力雁塔城运集团实现西安市城投企业数据资产入表第一单!

近日,雁塔区城运集团联合陕数集团、深圳竹云科技股份有限公司等机构,顺利完成数据资产确权登记和数据资产入表工作,成为西安市首个城投数据资产入表案例,并获得陕西丝路数据交易中心颁发的数据资产登记证书。 近年来,…

使用Vue-cli脚手架创建uni-app项目(Vue2版本)

文章目录 前言准备工作接下来创建我们的 uni-app 项目 前言 uni-app官方说除了HBuilderX可视化界面,也可以使用 cli 脚手架,可以通过 vue-cli 创建 uni-app 项目。 uni-app官网文档 准备工作 需要安装 node.js 与 vue-cli 脚手架 我是用的版本如下 no…

【Python】从基础到进阶(二):了解Python语言基础以及数据类型转换、基础输入输出

🔥 个人主页:空白诗 文章目录 一、引言二、基本数据类型转换1. 隐式转换2. 显式转换 三、基本输入输出1. 输入(input)2. 输出(print)3. 案例:输入姓名、年龄、身高以及体重,计算BMI指…