音频筑基:一文搞懂DFT/FFT/DCT/MDCT的区别

2024-02-23 20:36

本文主要是介绍音频筑基:一文搞懂DFT/FFT/DCT/MDCT的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

音频筑基:一文搞懂DFT/FFT/DCT/MDCT的区别

    • 前言
    • DFT/FFT/STFT/DCT/MDCT一句话对比
    • DFT/FFT/STFT/DCT/MDCT的因果
    • 扩展资料

傅立叶变换是连接时域与频域的上帝之桥。——《漫画傅里叶解析》

前言


音频信号处理中时常用到时频域转换,这里简单总结下常用的DFT、FFT、STFT、MDCT的区别。开始前,先感谢傅里叶大哥,是他给了我们一碗饭吃。

DFT/FFT/STFT/DCT/MDCT一句话对比


  • DFT,Discrete Fourier Transform,离散傅里叶变换,完成离散点时频域转换
    • 用途:推广时频域原理,理论上保证了计算机可用性
  • FFT,Fast Fourier Transform,快速傅里叶变换,计算长时总体信号的一种快速变换方法
    • 用途:支撑理论到实际,落地傅里叶变换在计算机中大规模使用
  • STFT,Short Time Fourier Transform,短时傅里叶变换,也称加窗傅里叶变换(Windowed Fourier Transform)
    • 用途:音频特征分析
  • DCT,Discrete Cosine Transform,离散余弦变换,跟DFT相对应
    • 用途:图像压缩
  • MDCT,Modified Discrete Cosine Transform,修改型离散余弦变换,顾名思义是DCT的改进,改进点是加窗和交叠
    • 用途:音频编解码

注:以上所有方法都可用于时频域转化。

DFT/FFT/STFT/DCT/MDCT的因果


19世纪,傅里叶老哥在用三角函数表示任意函数中获得启发,打开了时频域转换的大门。换个角度看问题后,对做信号处理的打工人来说,从此复杂变简单。

有了理论上的连续函数傅里叶变换FT,为了支持离散的计算机运算处理,于是就有了离散傅里叶变换DFT

而早年间,计算机处理器能力有限,如果光实现时频域转换算法就费老大事儿了,那后面的分析算法就没得搞了。于是,为了加速傅里叶变换速度,聪明的人类又搞出来快速傅里叶变换FFT

以上问题都是针对整体信号的变换(连续或离散),接着人们在实际分析信号时,发现代价还是太大,特别是音频信号处理场景,需要流式处理,根本等不及咱变换完就开车溜了。那些脑瓜冒烟的人又想到,根据语音短时平稳性原理对信号切帧分块处理,于是就有了短时傅里叶变换STFT

到后面又有了发展,傅里叶变换本质是正余弦cos/sin正交基组合而来,N点数据进去出来2N点的数据,有一半镜像是冗余数据。在信号压缩场景中,那些脑瓜冒烟的人又想到,能不能懒一些,就用一个基来表达,比如余弦cos。于是,就有了离散余弦变换DCT,实现N点进N点出。

最后,仍是类似的剧情,DCT用于整体信号的变换不太友好,在分帧切块后通过加窗和交叠方法,于是有了改进型离散余弦变换MDCT

注:1、STFT后面每一步演变,都包含了之前成果如DFT、FFT。2、MDCT/DCT都可以拆解转换到DFT、FFT实现。3、为增强可读性,部分描述和理论有差异。

更多原理细节分析,请看下篇详解。

扩展资料


  1. 如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧,link
  2. 感性认识FFT傅里叶变换,link
  3. 如何给5岁孩子解释DCT,link

这篇关于音频筑基:一文搞懂DFT/FFT/DCT/MDCT的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/739852

相关文章

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Spring中@RestController和@Controller的使用及区别

《Spring中@RestController和@Controller的使用及区别》:本文主要介绍Spring中@RestController和@Controller的使用及区别,具有很好的参考价... 目录Spring中@RestController和@Controller使用及区别1. 基本定义2. 使

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例