前面有提到音频采样算法:

WebRTC 音频采样算法 附完整C++示例代码

简洁明了的插值音频重采样算法例子 (附完整C代码)

近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题。

坦白讲,我精力有限,但一般都会抽空回复一下。

大多数情况,阅读一下代码就能解决的问题,

也是要尝试一下的。

没准,你就解决了呢?

WebRtc的采样算法本身就考虑到它的自身应用场景,

所以它会有一些局限性,例如不支持任意采样率等等。

而简洁插值的这个算法,

我个人也一直在使用,因为简洁明了,简单粗暴。

我自然也就没有进一步去细究采样算法,

当然网上还有不少开源的采样算法也是极其不错的。

一直也想抽时间再做一个兼顾简洁和质量的算法出来,不了了之。

最近一直在死磕傅里叶变换,网上的资源看了一箩筐。

徘徊到最后,毫无疑问FFTW3必须是你的首选,

从岁数性能以及使用的概率来说,当之无愧的王者。

当然也顺带整理一下,其他的一些FFT实现,各有优劣。

用于学习,作为参考资料也是不二之选。

有兴趣的小伙伴,可以参阅之.

https://github.com/cpuimage/StockhamFFT

https://github.com/cpuimage/uFFT

https://github.com/cpuimage/BluesteinCrz

https://github.com/cpuimage/fftw3

当然最佳的参考资料,还是fftw3,

我的这个git做了以下工作:

1.梳理调整目录结构

2.移除一些影响阅读调试,让人头大的宏定义

3.合并代码至fftw_api.c,移除一些不常用的代码

注意:未经过严格测试验证

也许这个git存在的意义在于方便众人阅读学习fftw的算法思路,

以及调试,扣代码等等诸如此类的行为。

所以有需要的同学可以,参考之。

回到本次的主题,

在以前做图像算法的时候,就一直在想一个问题,

是否可以利用傅里叶变换的特性进行图像的重采样呢?

这个一直是我心中的一个小石头,一直没放下。

从理论上来说,可行的,只是估计最终质量并不能保证。

最佳的尝试莫过于音频重采样,在很多时候,

我们经常需要对一个音频进行傅里叶变换,然后进行上采样或下采样的操作。

那是不是可以直接就在频域进行重采样呢?

这样的做法是不是质量就能有所保障呢?

事实证明,这是可行的。

经过简单试验,基于傅里叶变换的音频重采样算法就这样出炉了。

目前示例采用hsfft 这个开源傅里叶变换进行验证,

没有采用fftw3的原因也很简单,因为fftw3编译器来有点麻烦。

而hsfft的函数风格与fftw3类似,只是速度性能上不及fftw3而已。

这样也符合我的要求,真正应用的时候再使用fftw3替换之即可,

在验证思路的时候,没必要动用fftw3,

这也是我为什么使用简洁重采样的原因之一。

每个步骤都要有策略和方法,不必太过较真。

如果特定情况下需要,我也可以上matlab,python,delphi,c#,c++等等。

语言只是工具,关键还是思路和思想。

贴上主要代码:

#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif void FFTResample(float *input, float *output, int sizeIn, int sizeOut) {fft_t *fftin = (fft_t *) calloc(sizeof(fft_t), sizeIn);fft_t *fftout = (fft_t *) calloc(sizeof(fft_t), sizeOut);if (fftin == NULL || fftout == NULL) {if (fftout)free(fftout);if (fftin)free(fftin);        return;}fft_real_object fftPlan = fft_real_init(sizeIn, 1);fft_r2c_exec(fftPlan, input, fftin);free_real_fft(fftPlan);int halfIn = (sizeIn / 2) + 1;int halfOut = (sizeOut / 2) + 1;for (int i = 0; i < MIN(halfIn, halfOut); ++i) {fftout[i].re = fftin[i].re;fftout[i].im = fftin[i].im;}fft_real_object ifftPlan = fft_real_init(sizeOut, -1);fft_c2r_exec(ifftPlan, fftout, output);free_real_fft(ifftPlan);float norm = 1.f / sizeIn;for (int i = 0; i < sizeOut; ++i) {output[i] = (output[i] * norm);}free(fftout);free(fftin);
}

算法非常简单,用一句时髦的语言来描述这个算法,就是“多退少补“。

需要补课FFT的可以移步:

从多项式乘法到快速傅里叶变换

项目地址:

https://github.com/cpuimage/fftResample

采用Cmake编译即可,示例代码也很简洁。

不多做解释了~

以上,权当抛砖引玉。

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com

转载于:https://www.cnblogs.com/cpuimage/p/9270739.html

基于傅里叶变换的音频重采样算法 (附完整c代码)相关推荐

  1. 基于rnn的语音降噪matlab,基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可惜的是作者没有提供数据训练集. 不过基本可以断定他采用的数据集里,肯定有ur ...

  2. java 对音频文件降噪_(转)音频降噪算法 附完整C代码

    转:https://www.cnblogs.com/cpuimage/p/8905965.html 降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法 ...

  3. 音频降噪算法 附完整C代码

    本文转载自博客:https://cloud.tencent.com/developer/article/1117226 降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言 ...

  4. wav文件降噪c语言,音频降噪算法 附完整C代码

    降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...

  5. 果蝇(FOA)优化算法(附完整Matlab代码,可直接复制)

    果蝇优化算法的核心是利用果蝇搜索实物的机制来对问题进行寻优.果蝇根据气味来确定食物的位置,食物腐烂程度越高,气味越大,果蝇对其越敏感.果蝇的觅食行为如下图: Fig1. 果蝇觅食行为示意图 1.果蝇位 ...

  6. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  7. java mp3静音检测,音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  8. 自动曝光修复算法附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus) 自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure) 自动曝光的是 ...

  9. 13_冒泡算法(附完整java代码)

    13_冒泡算法 一.基本介绍 ​ 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前 ...

最新文章

  1. CBV 验证装饰器的使用
  2. 北师大计算机网络原理和应用作业,北师大网络作业计算机组成原理 作业一(可编辑)...
  3. 为什么 GROUP BY 之后不能直接引用原表中的列?
  4. Halcon知识:如何求一个工件的粗细
  5. ArcGIS API for JavaScript 入门教程[5] 再讲数据——Map类之底图与高程
  6. l298n电机驱动模块_带DRV8825驱动器模块和Arduino的控制步进电机
  7. lvm-snapshot:基于LVM快照的备份
  8. [导入]Asp.net中动态在中加入Scrpit标签
  9. 西安下雪了,做了一个室内温度计
  10. IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
  11. 02-JAVA语法基础
  12. mysql数据库创建删除带横杠的数据库名
  13. FS_FT_DFT_DFS_DTFT傅里叶
  14. 使用python bloomfilter实现大文本去重
  15. windows 下vscode coderunner+bash 编程
  16. Laravel 使用 seeder 使用要点
  17. 数字疗法001 | 心理疾病太痛苦。把你的心理健康交给昭阳医生吧
  18. JS(解构) 之数组和对象中提取数据总结
  19. 一、什么是JavaWeb?
  20. STM32学习笔记(15)——SPI协议

热门文章

  1. C语言中:#define宏的正确使用
  2. socket()函数详解!
  3. windows下进程间通信的(13种方法)
  4. 数据为什么要可视化?如何可视化?
  5. js中如何优雅的解析数据
  6. Linux 下安装和配置TSM 7.1
  7. Java虚拟机2:Java内存区域及对象
  8. 阿里云CDN技术 揭秘
  9. 【观点】避免不必要的代码缩进和嵌套
  10. SqlServer 中Binary类型的数据如何转化为字符串