# 音频处理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,则返回复数类型的结果。否则,返回一个两通道的实数张量,其中一个通道是实部,另一个通道是虚部。

4.代码样例

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

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

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

代码在Github_Link

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

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

相关文章

详细学习es6扩展运算符

ES6中的扩展运算符(Spread Operator)是一种非常方便的语法,主要用于将可迭代对象(比如数组、字符串等)展开成多个参数。以下是关于ES6扩展运算符的详细内容: 用法: 在数组字面量中展开数组&am…

C# 超简单的离线人脸识别库 - ViewFaceCore

项目介绍 ViewFaceCore是一个基于 SeetaFace6 的 .NET 人脸识别解决方案。 项目特点 开源(MIT license)、免费、简单的离线人脸识别库。 跨平台(适用于 Windows、MacOS 和 Linux )。 .NET 框架 和 操作系统 封装完善的NuGet包…

《昇思25天学习打卡营第1天 | 快速入门 mindspore》

1. 背景: 今天开始参与 CSDN 的活动,使用 mindspore 学习神经网络,先学习的是第二小节; 2. 训练的内容: 第二小节内容: 使用 mindspore ,构建 DenseNet,识别手写字符;…

[CAN] 通讯协议手动解析与手动打包 [手撕编码格式]

手动解析与手动打包 一、Intel格式编码1.1 报文解析。1.2 报文打包二、Motorola格式通讯协议2.1 报文解析。2.2 报文打包🙋 前言 CAN有两种编码格式:Intel编码格式 和 Motorola编码格式,本教程将分别对两种格式进行手动解析与手动打包。 一、Intel格式编码 假设已知雷达CAN…

医疗数据分析

我待过2家大公司做医疗的,发现了他们的共性,有很多通用的方法,先说数据,医疗数据中最麻烦的,我觉得就是检验数据。 为什么?因为检查的指标项多,占所有数据的百分之50以上。 指标歧义: 血红蛋…

接口自动化测试框架实战(Pytest+Allure+Excel)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1. Allure 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不…

凡人修仙传单机版的激活码

谁有凡人修仙传单机版的激活码,急 首页 用户 合伙人 商城 法律 手机答题 我的 谁有凡人修仙传单机版的激活码,急 能玩就行,有的请留下QQ号码,我们私聊,感激不尽。 分享 举报 2个回答#热议# 不吃早饭真的会得胆结石吗&a…

项目开发 TCP-Socket连接功能实现(Android端)

前段时间在公司做项目的时候遇到了一个功能需要使用TCP-Socket连接硬件设备进行通信,查了很多资料也只是关于HTTP-Socket相关的,没法满足项目的要求,后来查到一个相关的插件,现在有时间和大家分享一下。 项目简单介绍&#xff1a…

如何在Windows 11中修复Wi-Fi的常见问题?这里有详细步骤

序言 如今,每个人都需要互联网,所以Wi-Fi瘫痪可能会引起恐慌。然而,永远不要害怕,因为有很多久经考验的方法可以让Wi-Fi重新上线!Windows 11中Wi-Fi最常见的问题也有常见的解决方案。 当你的Windows 11 Wi-Fi不工作时该怎么办 如果你注意到你的电脑没有连接到互联网,这…

关于Vue组件间通信会问到哪些面试题?

在Vue面试中,关于组件间通信的问题是非常常见的。以下是一些可能会问到的面试题: Vue组件间通信的基本方式有哪些? 父向子传: 子组件通过props接收父组件传递的数据。子组件可以直接通过this.$parent.xxx使用父组件的数据&#x…

使用MoA(Mixture of Agents)混合智能体技术,结合多个开源大语言模型如Llama3、phi-3和Mistral,实现一个强大的AI智能体

1.简介 论文简介: 论文提出了一种称为混合智能体(Mixture-of-Agents,MoA)的方法,利用多个大语言模型(LLM)的集体智慧来提高自然语言理解和生成任务的性能。 MoA采用了分层结构,每一层包含多个LLM智能体。每个智能体都将前一层所有智能体的输出作为辅助信息来生成自己的回答。通…

2024C#面试真题:单向链表的查询、插入

一、题目 面试题:C#编程实现以下要求(不允许用封装方法,需要自己构建): 1. 依照数据,实现Student类 2. 实现单向链表类 类方法: 1) Student Get(int id); 根据学号查询,参数为int regID, 返回为Student对…

Java日常探秘-从小疑问到实践智慧的编程之旅(2)

文章目录 前言一、常见错误400错误401错误404错误MismatchedInputExceptionMybatis的NumberFormatExceptionMybatis的Available parameters are [collection,list]]报错Mybatis之Double类型的字段的值为0.0传入不了sql中 二、SQL效率数据库字段类型和传入参数类型不匹配小表驱动…

【手撕代码】握手机制

文章目录 为什么要握手握手信号无非3种可能 怎样实现握手案例一:数据反压 参考链接 为什么要握手 跨时钟域处理: 握手信号法其实也用到了脉冲展宽的方法,只是展宽信号的变化条件不同。因为如果不对脉冲进行展宽,慢速时钟域的时钟…

PromptCraft-Robotics部署步骤和问题记录

GitHub - microsoft/PromptCraft-Robotics: Community for applying LLMs to robotics and a robot simulator with ChatGPT integration 部署环境:UE4.27 Visual Studio 2022 Arisim1.8.1 可参考:git clone https://github.com/Microsoft/AirSim.gi…

用promise实现批量请求数据,同时支持控制请求的并发数

假设有个业务场景,要求:可以批量请求数据,所有的 URL 地址在 urls 参数中,同时可以通过 max 参数控制请求的并发度,当所有请求结束之后,需要执行 callback 回掉函数。 JavaScript代码实现 async function sendRequest(urls, max, callback) {// 用于存储所有请求的promi…

Java三方库-单元测试

文章目录 Junit注解常用类无参数单测带参数的单测 Junit 主要版本有4和5版本,注解不太一样, 4迁移5参考官方文档 主要记录下常用的一些操作 其他复杂操作见官网 https://junit.org/junit5/docs/current/user-guide/#overview-java-versions 引入5.9…

WSL Ubuntu 如何设置中文语言?

本章教程,主要介绍如何在WSL Ubuntu 如何设置中文语言。 操作系统:Windows 10 Pro 64 WSL子系统:Ubuntu 20.04 LTS 一、安装中文语言包 sudo apt install language-pack-zh-hans二、设置中文语言 sudo dpkg-reconfigure locales选择en_US.UTF-8 和 zh_CN.UTF-8 选择zh_CN.…

Java虚拟机(JVM)中符号引用(symbolic reference)和直接引用以及转化过程

在Java虚拟机(JVM)中,符号引用(symbolic reference)和直接引用(direct reference)是两种不同的引用方式。了解这两种引用方式有助于更深入地理解Java的运行时机制,特别是类加载和方法…

jps命令解释以及用法

JPS命令是Linux系统中的一个常用命令,用于显示Java进程的相关信息。下面是JPS命令的详解: JPS命令是Java Development Kit(JDK)提供的一个工具,用于列出JVM进程(Java虚拟机进程)的信息。它通常…