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

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, );
fft_r2c_exec(fftPlan, input, fftin);
free_real_fft(fftPlan);
int halfIn = (sizeIn / ) + ;
int halfOut = (sizeOut / ) + ;
for (int i = ; 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, -);
fft_c2r_exec(ifftPlan, fftout, output);
free_real_fft(ifftPlan);
float norm = .f / sizeIn;
for (int i = ; i < sizeOut; ++i) {
output[i] = (output[i] * norm);
}
free(fftout);
free(fftin);
}

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

需要补课FFT的可以移步:

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

项目地址:

https://github.com/cpuimage/fftResample

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

不多做解释了~

以上,权当抛砖引玉。

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

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

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

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

    前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...

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

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

  3. mser 最大稳定极值区域(文字区域定位)算法 附完整C代码

    mser 的全称:Maximally Stable Extremal Regions 第一次听说这个算法时,是来自当时部门的一个同事, 提及到他的项目用它来做文字区域的定位,对这个算法做了一些优化. ...

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

    之前有大概介绍了音频采样相关的思路,详情见<简洁明了的插值音频重采样算法例子 (附完整C代码)>. 音频方面的开源项目很多很多. 最知名的莫过于谷歌开源的WebRTC, 其中的音频模块就包 ...

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

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

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

    转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...

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

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

  8. 磨皮美颜算法 附完整C代码

    前言 2017年底时候写了这篇<集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序> 这也算是学习过程中比较有成就感的一个算法. 自2015年做算法开始到今天,还有个把月 ...

  9. 音频压缩编码 opus 附完整C++代码示例

    绝大数人都知道mp3格式编码,以及aac,amr等压缩格式编码. 而在语音通信界有一个强悍的音频格式编码opus. 经过实测,压缩比最高可以达到1:10. 100KB 压缩后 10KB 虽然是有损压缩 ...

随机推荐

  1. windows10 蓝牙(Bluetooth®)设备删除失败解决方案

    某次更新后蓝牙鼠标突然断线无响应,于是尝试删除设备后重新配对,但是出现了删除失败: 这时候可以这样解决: 进入设备管理器(Win+X 设备管理器) 点击 查看 (在最上面一行),选择"显示隐 ...

  2. git-day1-安装和基础使用

    Git介绍 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 ...

  3. 如何在两个月的时间内发表一篇EI/SCI论文-我的时间管理心得

    在松松垮垮的三年研究生时期,要说有点像样的成果,也只有我的小论文可以谈谈了.可能有些厉害的角色研究生是丰富而多彩的,而大多数的同学在研究生阶段可能同我一样,是慢悠悠的渡过的,而且可能有的还不如我,我还 ...

  4. D3——动态绑定数据

    一.绑定数组元素 , , , , ]; d3.select("body") .selectAll("p") .data(dataset) .enter() .a ...

  5. MATLAB入门学习(二)

    关于矩阵 ~o( =∩ω∩= )m matlab矩阵运算很强大 ,几乎所有涉及矩阵运算的命令都有. 事实上,matlab里面所有变量都是以矩阵的形式保存下来的. 一个数字是1x1矩阵 我们来看看矩阵的 ...

  6. ZOJ-3286 Very Simple Counting---因子数打表

    题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...

  7. fastcgi c/c++ API 说明

    fastcgi c/c++ API 下载地址:https://github.com/FastCGI-Archives 先上example #include <iostream> #incl ...

  8. [19/04/08-星期一] 多线程_线程的优先级(Priority) 和 守护线程(Daemon)

    一.概念 1. 处于就绪状态的线程,会进入“就绪队列”等待JVM来挑选. 2. 线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5. 3. 使用下列方法获得或设置线程对象的优先级. in ...

  9. mongodb安装(比较全一点)

    Linux下MongoDB安装和配置详解  转:https://www.cnblogs.com/pfnie/articles/6759105.html 一.创建MongoDB的安装路径 在/usr/l ...

  10. 统计 SQL Server中的 Job 情况

    SELECT J.name 作业名称, P.step_id'步骤编号',P.step_name'步骤名称',p.SubSystem '步骤类型',P.command'执行命令', CASE freq_ ...