本文中使用的语言为c++,使用的三方库为fftw,libsndfile

音频的时域转频域

这一部分主要使用傅里叶变换,将时域转成频域。这一块的帖子已经很多,这里不再赘述了。主要注意点如下:

  • fftw库的使用,请参考 fftw官网
  • libsndfile库的使用,请参考 libsndfile官网
  • 窗体采用汉宁窗,宽度为512ms,处理音频采样率为8k,16bit,单声道,窗体移动为1/2窗体宽度

    汉宁窗函数如上所示

实现逻辑如下:

  1. 使用libsndfile读取wav文件,获取到double数组
  2. 制定窗宽度为512ms,sample长度为N=512*8
  3. 每个窗载入N个sample的数组,然后做傅里叶变换,调用fftw_plan_dft_r2c_1d函数,获取到复数数组。
    // HERE IS pseudocodedouble *in = (double *) fftw_malloc(N* sizeof(double));fftw_complex  *out = (fftw_complex *) fftw_malloc(N* sizeof(fftw_complex));... ...for (int i = 0; i < N; ++i) {double multiplier = 0.5 * (1 - cos(2*M_PI*i/(N-1)));//Hanning Windowin[i] =  wav[i]*multiplier;}... ...plan = fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);fftw_execute(plan);
  1. 窗体移动1/2窗体宽度,载入N个sample,再做一次步骤3
  2. 重复步骤4,直到窗体移动到文件末尾

从频域恢复到时域

一般来说,在频域中我们会做一些处理,比如说滤波,将50HZ以下的频率去掉。可以在频域中轻松处理。处理后再使用傅里叶逆变换将频域数据恢复成时域数据。

如下将低频部分频率滤掉

 // HERE IS pseudocodefor (int i = 0; i < N; ++i) {if (i<=50) {out[i][0] = 0;out[i][1] = 0;}}

再转回时域

    double *out2 = (double *) fftw_malloc(N* sizeof(double));fftw_plan backword_plan  = fftw_plan_dft_c2r_1d(N, out, out2, FFTW_ESTIMATE);fftw_execute(backword_plan);for (int i=0; i<N; ++i) {out2[i] = out2[i]/N; // normalization}

最后将数据写入wav文件。
写的时候注意。因为是有重复数据的(窗体是有一半重复的),所以重复的部分是要相乘处理的。

一些常见问题

为什么窗体宽度为512ms?

这个主要看主要分析的频谱范围,因为本人只关心2kHZ以下部分,为了达到这个频率,窗里的sample数必须达到4k以上。512*8=4096,达到要求即可。如果需要更高频率,需要按此计算。

频域转时域是否需要加窗?

上面的例子是没有的,但是实际上是需要的。

窗其实分为两种, 分析窗和合成窗
只是巧合的是位移1/2的汉宁窗(分析窗)+ 矩形窗(合成窗)正好可以还原信号。

还有一种组合是 1/2的正弦窗+ 正弦窗(合成窗)也是可以还原信号的。

为什么窗体位移为1/2?

原始信号乘以窗函数后,无论是哪一种,都会存在前后部分的信号衰减。这主要是因为窗函数的意义——它就是为了将窗体部分的信号趋近于周期的。
1/2的汉宁窗移动有个好处是,前一个窗体的后半部分乘以下一个窗体的前半部分,正好可以还原衰减信号。利用这个特性,所以选取位移为1/2.

为何还原出来的音频听上去一段一段的?

这个问题的根因正如上一个问题的解答。那么为什么会出现这个现象?

一般来说,原始信号没有使用窗函数,在还原的时候会出现这个现象。

因为在做傅里叶变换时,对变换的信号是由周期性要求的。但是真实环境中的声音是不可能的。所以我们需要加窗处理,将窗中的信号趋近于周期性。

如果非周期行函数做处理会发生什么?能量的泄露。主频率的能量会被分散到其他频率上。这种泄露的频谱再逆变换回来的时候,原信号必然发生失真。而傅里叶变换是一段一段处理的,所以最终的音频也会出现一段一段的失真。


如果您觉得有所帮助,请给与一定的支持和鼓励。感谢。

音频处理中频域转时域的恢复相关推荐

  1. 傅里叶变换音频可视化_音频可视化中的信号处理方案

    声明: 原创文章,未经允许不得转载. 音频可视化是一个"听"起来非常"美"好的话题,其复杂程度很大程度上依赖视觉方案(一些例子),不同的视觉方案决定了你的技术方 ...

  2. 傅里叶变换音频可视化_Web Audio在音频可视化中的应用

    Web Audio在音频可视化中的应用 本文有两个关键词:音频可视化和Web Audio.前者是实践,后者是其背后的技术支持. Web Audio 是很大的知识点,本文会将重点放在如何获取音频数据这块 ...

  3. 如何在音频分析中使用机器学习和深度学习

    介绍 深度学习领域的学术论文很多都是关于计算机视觉和自然语言处理,而音频分析(包括自动语音识别,数字信号处理,音乐分类.标签.生成)领域的运用也逐渐受到了学者们的关注.目前最流行的机器学习系统,如虚拟 ...

  4. luceda ipkiss教程 14:马赫曾德干涉仪频域和时域仿真

    在光子集成线路设计中,马赫曾德干涉仪是一个非常基础和非常重要的器件,其是可编程光子芯片.集成光计算网络以及集成量子密钥分配系统的重要组成部分.接下来介绍利用ipkiss来设计一个可调的MZI,并通过i ...

  5. 网易云音乐动效Android,Web Audio在音频可视化中的应用(网易云音乐鲸云动效)...

    本文有两个关键词:音频可视化和Web Audio.前者是实践,后者是其背后的技术支持. Web Audio 是很大的知识点,本文会将重点放在如何获取音频数据这块,对于其 API 的更多内容,可以查看 ...

  6. 思必驰周强:AI 和传统信号技术在实时音频通话中的应用

    如何用 AI 解决声音传输&处理中的三大问题?三大问题又是哪三大问题? 在「RTE2022 实时互联网大会」中,思必驰研发总监 @周强以<AI 和传统信号技术在实时音频通话中的应用> ...

  7. 带有SpeechSense算法的AGC在音频系统中的应用

    自动增益控制(简称为"AGC")可以在信号的输出端提供稳定增益,而不受输入端增益不同的影响.本文主要阐述了AGC的工作原理以及在音频系统中的具体应用. 一直以来,传统的AGC在应用 ...

  8. 人工智能在音频链中找到自己的声音

    人工智能在音频链中找到自己的声音 AI finds its voice in audio chain 硅基silicon-based麦克风的出现重塑了音频领域.但在未来几年,市场研究公司Yole Dé ...

  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截...

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...

最新文章

  1. NFL原则告诉我们做决策的时候,试图找到一个能解决所有问题,“大而全”的方案是不存在的。我们应当找到最关心的问题,因地制宜做出选择。——聚焦目标,取舍有道!...
  2. ubuntu 13.04下MYSQL 5.5环境搭建
  3. 【业务】现金贷获客之道业务流程分析
  4. 与崇洋媚外的程序员的辩论
  5. angular2创建应用_如何使用Angular和SQLite3创建Electron应用程序。
  6. 浅谈c++中结构体和共用体的区别
  7. anaconda装完没反应
  8. 中国能源统计年鉴面板数据-分省市主要污染物排放指标(包含ECXEL2020年中国统计年鉴)
  9. 反向题在测试问卷信效度_检验问卷的信度和效度
  10. 电脑怎么压缩图片大小kb?压缩图片用什么软件?
  11. Vue小项目——仿cnode.js社区
  12. 操作系统实验一 添加内核模块
  13. 计算机毕业设计JAVA家庭健康预警系统mybatis+源码+调试部署+系统+数据库+lw
  14. java ascii 编码方式,Java 字符编码 ASCII、Unicode和UTF-8
  15. Pandas 基础(16) - Holidays
  16. 榕树说技术支持(Rong Zhiyun technical support)
  17. 【python】简单实现打开浏览器并自动点击跳转
  18. 《联想公司不是家》:员工真不能把企业当成家
  19. centos 升级glibcc++
  20. 【STM32】STM32 F4系列时钟树与RCC寄存器

热门文章

  1. R语言读取CSV文件
  2. 树突网络Dendrite Net
  3. 附录4:Matplotlib实例记录
  4. Linux 中多终端同步 history 记录
  5. 如何写好一篇科技论文?以Wiley科技刊为例(附视频)
  6. 掌握生信技术,玩转生态与地理领域的科研套路
  7. pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)
  8. Error: Discrete value supplied to continuous scale
  9. R语言rep函数重复向量或者列表元素实战
  10. R语言四格表、列联表秩和检验