0

我的问题有点抽象,但有充分的理由。我已经成功运行了一个用 C 编写的 JACK 脚本,它将麦克风音频数据循环到扬声器,但是我想知道如何在播放过程中改变我自己的音频流,也许我想尝试的一件事是过滤高(或低)频率(完全切断它们)。据我了解,音频以模拟信号的形式出现并转换为数字值(在一定范围内)。

我猜我被迫采用两种方法中的一种,我认为一种方法是处理每个值并检查它是否低于我不想要的频率(或高于频率),然后将值更改为0(或上一个循环周期的前一个值,以防止播放期间音频中出现空白点)。我猜测的第二种方式是 JACK 为缓冲区提供了由频谱分配的完整值数组。我该怎么做呢?(将来我想用原始数据做其他事情,但我认为这是熟悉原始音频处理的一个很好的开始)

这是我的简化代码: http: //pastebin.com/Hmiumqkz 你可以看到我尝试打印in值,因为它应该是一个“浮点数”,我想我可以从那里过滤频率,但我不是当然,当我运行此代码时,我没有在控制台中打印任何内容,它只是将麦克风循环回扬声器,但没有任何打印到控制台.....

注意:我已经成功编译和测试了使用 Gstreamer、ALSA、NAudio、irrKang 和 Phonon 库的程序,它们不允许我在操作系统和我需要的原始音频数据之间具有交叉兼容性项目,我所要求的只是在懒惰地报告我使用“其他库”之前请三思而后行,只是为了“更容易”,但我已经尝试过它们,但它们都让我失望了。

4

2 回答 2

0

您还没有真正提出可以在 SO 上回答的问题,所以我将向您指出一些外部资源。

这是一个基于流行的RBJ 滤波器设计 EQ 的教程:

http://blog.bjornroche.com/2012/08/basic-audio-eqs.html

其中大部分是用类似 C 的伪代码编写的,并将逐步引导您完成。

于 2012-12-13T02:55:42.837 回答
-1

这是正确的答案(您会注意到 proccess(){} 回调函数中的 printf() 函数)for 循环打印出缓冲区中的当前帧(频域但 for() 循环正在打印时间,所以它也是时域——它的频率和时间)

http://pastebin.com/axDLw7cc

于 2012-12-13T06:09:19.870 回答