跟着AI学AI_02, 时域频域和MFCC

AI:ChatGPT4o

在这里插入图片描述
时域和频域是信号处理中的两个基本概念,用于描述信号的不同特性。

时域

时域(Time Domain) 是对信号随时间变化的描述。在时域中,信号是作为时间的函数来表示的。

  • 时域表示:例如,一个音频信号在时域中的表示就是一个随时间变化的波形。
  • 时域特征:信号的幅度、持续时间、波形形状等。

示例:考虑一个简单的正弦波信号:
[ x(t) = A \sin(2\pi ft + \phi) ]
其中,( A ) 是幅度,( f ) 是频率,( \phi ) 是相位,( t ) 是时间。

在时域中,这个信号看起来像一个随时间上下振荡的波形。

频域

频域(Frequency Domain) 是对信号的频率成分的描述。在频域中,信号是作为频率的函数来表示的。

  • 频域表示:例如,通过傅里叶变换,可以将时域信号转换为频域信号,这样我们可以看到信号中包含的各个频率成分及其幅度。
  • 频域特征:信号的频谱、频率分量、带宽等。

示例:考虑上面的正弦波信号,如果我们对它进行傅里叶变换,我们会得到一个在频域中的表示:
[ X(f) = \frac{A}{2j} [\delta(f - f_0) - \delta(f + f_0)] ]
这里,( \delta ) 是狄拉克δ函数,表示在 ( f = f_0 ) 和 ( f = -f_0 ) 处有一个尖峰(对应频率成分)。

时域和频域的转换

时域和频域之间的转换通常通过傅里叶变换和逆傅里叶变换来实现。

  1. 傅里叶变换

    • 将时域信号转换为频域信号。
    • 连续傅里叶变换(Continuous Fourier Transform, CFT)定义为:
      [ X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dt ]
  2. 逆傅里叶变换

    • 将频域信号转换回时域信号。
    • 连续逆傅里叶变换(Inverse Continuous Fourier Transform, ICFT)定义为:
      [ x(t) = \int_{-\infty}^{\infty} X(f) e^{j2\pi ft} df ]

在离散信号处理中,通常使用离散傅里叶变换(Discrete Fourier Transform, DFT)和快速傅里叶变换(Fast Fourier Transform, FFT)。

代码示例

下面是一个简单的例子,展示如何使用Python和numpy库进行傅里叶变换:

import numpy as np
import matplotlib.pyplot as plt# 生成一个简单的时域信号:正弦波
fs = 1000  # 采样率
t = np.linspace(0, 1, fs)  # 时间向量
f = 5  # 信号频率
x = np.sin(2 * np.pi * f * t)  # 生成正弦波# 进行傅里叶变换
X = np.fft.fft(x)
frequencies = np.fft.fftfreq(len(X), 1/fs)# 画出时域信号
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(t, x)
plt.title('时域信号')
plt.xlabel('时间 (秒)')
plt.ylabel('幅度')# 画出频域信号
plt.subplot(2, 1, 2)
plt.plot(frequencies[:len(frequencies)//2], np.abs(X)[:len(X)//2])
plt.title('频域信号')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')plt.tight_layout()
plt.show()

解释

  1. 时域信号

    • 生成一个5Hz的正弦波信号,采样率为1000Hz。
    • 在时域中,信号表示为一个随时间变化的波形。
  2. 频域信号

    • 使用numpy.fft.fft进行傅里叶变换,将时域信号转换为频域信号。
    • 使用numpy.fft.fftfreq生成对应的频率轴。
    • 在频域中,信号表示为频率成分的幅度谱。

总结

  • 时域:信号随时间变化的表示,关注时间上的特性。
  • 频域:信号的频率成分的表示,关注频率上的特性。
  • 转换:傅里叶变换用于将时域信号转换为频域信号,逆傅里叶变换用于将频域信号转换回时域信号。

这两个域提供了不同的视角来分析和处理信号,在信号处理、通信、音频处理等领域有广泛的应用。

在这里插入图片描述
MFCC(Mel Frequency Cepstral Coefficients,梅尔频率倒谱系数)是语音信号处理中的一种特征提取方法,广泛用于语音识别和音频分析领域。它基于人类听觉系统的感知模型,能够有效地表示音频信号的特征。

MFCC的计算步骤

  1. 预加重 (Pre-emphasis)

    • 通过一个高通滤波器来增强高频成分,补偿语音信号中高频部分的能量损失。
    • 通常使用的滤波器: y [ t ] = x [ t ] − α ⋅ x [ t − 1 ] y[t] = x[t] - \alpha \cdot x[t-1] y[t]=x[t]αx[t1],其中, x [ t ] x[t] x[t]是输入信号, y [ t ] y[t] y[t]是输出信号, α \alpha α一般取值0.97。
  2. 分帧 (Framing)

    • 将语音信号分成短时帧,一般每帧20-40毫秒,每帧之间有一定的重叠(通常是50%)。
    • 例如,25毫秒的帧长和10毫秒的帧移。
  3. 加窗 (Windowing)

    • 为了减少分帧过程中引入的频谱泄漏效应,对每一帧信号进行加窗处理。
    • 常用的窗函数是汉明窗(Hamming Window): w [ n ] = 0.54 − 0.46 cos ⁡ ( 2 π n N − 1 ) w[n] = 0.54 - 0.46 \cos\left(\frac{2\pi n}{N-1}\right) w[n]=0.540.46cos(N12πn),其中, N N N是窗的长度。
  4. 快速傅里叶变换 (Fast Fourier Transform, FFT)

    • 对每一帧信号进行FFT,得到频域信号。
    • 目的是从时域信号转换到频域信号,以便分析其频率成分。
  5. 梅尔频率滤波器组 (Mel Filter Bank)

    • 将频域信号通过一组梅尔频率滤波器,模拟人耳的听觉感知。
    • 梅尔频率是根据人耳的感知频率尺度定义的,低频部分滤波器密集,高频部分滤波器稀疏。
  6. 对数功率谱 (Log Power Spectrum)

    • 对通过梅尔滤波器的功率谱取对数,得到对数功率谱。
    • 目的是将乘性噪声转换为加性噪声,从而更容易处理。
  7. 离散余弦变换 (Discrete Cosine Transform, DCT)

    • 对对数功率谱进行DCT,得到MFCC系数。
    • DCT的目的是压缩特征维度,并集中能量到低维部分。

代码示例

以下是使用librosa库计算MFCC的示例代码:

import librosa
import matplotlib.pyplot as plt
import numpy as np# 加载音频文件
y, sr = librosa.load('path_to_audio_file.wav', sr=None)# 计算MFCC
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)# 显示MFCC特征
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfcc, x_axis='time')
plt.colorbar()
plt.title('MFCC')
plt.tight_layout()
plt.show()

解释

  1. 加载音频文件librosa.load函数加载音频文件,返回音频时间序列y和采样率sr
  2. 计算MFCClibrosa.feature.mfcc函数计算音频信号的MFCC特征。
  3. 显示MFCC特征:使用librosa.display.specshow函数可视化MFCC特征。

总结

MFCC通过模拟人耳的听觉感知特性,提取音频信号中的关键特征,具有很高的表达能力和鲁棒性,因此在语音识别领域得到了广泛应用。计算MFCC包括预加重、分帧、加窗、FFT、梅尔频率滤波器组、对数功率谱和DCT等步骤,每一步都对最终特征的质量有重要影响。

maraSun YBJFWDQ

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

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

相关文章

双指针解题

验证回文数(验证回文数-CSDN博客)和判断在子序列(判断子序列-CSDN博客)已经在之前进行了计算,今天有三个新的双指针问题: 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0…

堆的认识和堆的操作

一.堆的认识: ① 也就是说它取出的顺序是需要搜索的,查找特定性质。 ② 数组:总是插入尾部(1),查找(n)移动元素删除特性(n) 链表:头插或尾插(1),查找(n)删特性(1) 所以为什么要调整顺序?就是为了查找特性方便。 有序数组:找到合适位置(n)移动元素插入(n),删除最…

HMM地图匹配算法库Barefoot环境搭建

1.引入gps路径匹配开源项目barefoot 克隆仓库 git clone https://github.com/bmwcarit/barefoot.git打开项目执行mvn命令将项目打包到maven仓库 mvn install -DskipTests在自己的maven项目中引入barefoot依赖 <dependency><groupId>com.bmw-carit</groupId&g…

第五篇 加法器

实验五 加法器 5.1 实验目的 掌握半加器和全加器的基本原理 掌握串行进位加法器的基本原理 掌握使用全加器实现串行进位加法器的基本原理 熟悉Verilog 代码设计 5.2 原理介绍 5.2.1 半加器 半加器和全加器是算数运算电路中的基本单元&#xff0c;它们是完成1位二进制数…

《MySQL索引》学习笔记

《MySQL索引》学习笔记 MySQL的体系结构存储引擎简介InnoDB简介MyISAM简介 索引索引结构BTreeHash索引思考索引分类 索引语法SQL性能分析索引使用最左前缀法则 索引失效的情况范围查询索引列运算字符串不加引号模糊查询or连接的条件数据分布影响 SQL提示覆盖索引前缀索引单列索…

操作系统复习-linux的进程管理

linux的进程管理 linux进程的相关概念 进程的类型 前台进程 前台进程就是具有终端&#xff0c;可以和用户交互的进程&#xff0c;会占用终端shell&#xff0c;不可以输入其他的命令。 后台进程 前台进程就是具有终端&#xff0c;可以和用户交互的进程。 不会占用终端shell&a…

macOS的word没有zotero怎么办

打开zotero,首选项,引用,重新安装加载项 然后到word里 点模板和加载项 把zotero勾上,OK了

Java学习【认识异常】

Java学习【认识异常】 认识异常异常的种类异常的作用 异常的处理方式JVM默认的处理方式捕获异常finally 多个异常的处理异常中的方法抛出异常 自定义异常 认识异常 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常 异常的种类 Error代表的是系统级别的错误&a…

ClickHouse 使用技巧总结

文章目录 数据导入、导出技巧外部文件导入导技巧使用集成表引擎导入、导出数据 建表技巧表引擎选择技巧分区键选择技巧数据结构选择技巧分区技巧 高级技巧物化视图投影位图变更数据捕获 常见报错及处理方法 数据导入、导出技巧 外部文件导入导技巧 ClickHouse作为OLAP即席分析…

每日一题《leetcode--206.反转链表》

https://leetcode.cn/problems/reverse-linked-list/ 这道题可以定义一个新结点newhead&#xff0c;newhead指向NULL。此时遍历所给链表将遍历的每个结点头插到newhead上。 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* curhead;struct ListNode* n…

Go语言垃圾回收(GC原理)

1. GC回收机制 1.1 V1.3标记清除法 (1)概述 1.STW暂停 STW(暂停业务逻辑,找出可达和不可达对象) 2.对可达对象做上标记 标记完成之后,对象5和对象6不可达,被GC清除.之后STW结束. (2).缺点 STW :让程序暂停,程序出现卡顿.标记需要扫描整个heap.清除数据会产生heap碎片. 1.…

YYDS练手 130道python练习题 完整版PDF

近年来&#xff0c;Python在编程语言界里赚足了风头&#xff0c;无论是受欢迎程度&#xff0c;还是薪资待遇&#xff0c;都非常可观&#xff0c;相应的&#xff0c;Python岗位要求也越来越高&#xff0c;无论你是零基础还是老前辈&#xff0c;在Python面试中都不能轻视。 不打…

对比WPF和Avalonia的边框渲染差异

众所周知&#xff0c;诸如Border、Rectangle等元素&#xff0c;是具有边框的。但在WPF和Avalonia中&#xff0c;边框的渲染机制有所不同。 如下代码&#xff0c;Border的边框和背景色均为黑色&#xff0c;并且将透明度设为0.5&#xff1a; <Border Width"100" H…

模拟实现C++vector

一&#xff1a;C库中对于vector的介绍 vector的底层其实就是数据结构中的顺序表&#xff0c;顺序表的底层就是变长数组&#xff0c;是一段连续的物理空间 在下面的实现中&#xff0c;重点实现的是其中的迭代器和插入删除&#xff0c;下标访问等功能&#xff0c;模拟实现模板类…

Vue中使用vuex进行全局数据共享处理

1、简介 在之前的博文中&#xff0c;介绍了如何进行组件之间的数据传递&#xff0c;但是对于所有组件共享的变量来说&#xff0c;使用组件之间的数据传递实现复杂&#xff0c;因此本文引入vuex进行全局数据共享。 2、vuex的下载配置 2.1、vuex的下载 # 对于vue2来说&#xf…

IP地址开启HTTPS方法

可以使用IP地址申请SSL证书&#xff0c;申请之前必须是公网IP地址&#xff0c;不支持内网IP地址申请。 申请过程需要确定IP地址外网可以访问&#xff0c;这里特别注意只是申请过程中可以访问。访问验证过程必须采取80端口、443端口两者选择1个&#xff0c;不可以用其它端口进行…

下载视频怎么转换MP4?wmv转换mp4,推荐这3种方法

在数字化时代&#xff0c;我们经常需要从网上下载各种视频&#xff0c;但有时候下载的视频并不是我们想要的格式&#xff0c;比如WMV。为了能在更多的设备上播放或进行编辑&#xff0c;我们可能需要将其转换为更通用的MP4格式。 那么&#xff0c;下载的视频如何转换成MP4呢&am…

第三篇 编译器和译码器

实验三 编码器和译码器 3.1 实验目的 上一章节我们学习了简单组合逻辑电路——多路数据选择器&#xff0c;在本章节我们将学习另外一种数字系统中常见的简单组合逻辑电路——编码器和译码器。然后通过一个设计一个简易的计算器让大家进一步巩固FPGA开发的流程和方法。 本节您…

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton在神经网络领域数十年如一日的研究&#xff0c;对深度学习的推动和贡献显著。 一、早期贡献与突破 反向传播算法的引入&#xff1a;Hinton是将反向传播&#xff08;Backpropagation&#xff09;算法引入多层神经网络训练的…

【C++进阶】深入STL之vector:构建高效C++程序的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现string &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之vector &#x1f4d2;1.ve…