【问题标题】:How to filter specific frequencies from an Audio file in C如何从 C 中的音频文件中过滤特定频率
【发布时间】:2014-03-14 23:51:33
【问题描述】:

在各种搜索引擎上搜索之后,也在这里,很少有信息适用于我的情况。 基本上我想用 C 语言编写一个程序,它执行以下操作:

  1. 打开一个音频文件(flac Mp3 和 wav,代表一点多样性)
  2. 过滤并切出一组特定的频率(例如 4000-5200hz,应根据查询输入频率)
  3. 以与输入文件相同的格式保存新文件(没有过滤的频率)。

我感兴趣的事情:

  1. 做相同或类似事情的软件的开源示例,最好用 C 语言

  2. 任何关于 C 音频编程的文献

  3. 解释不同格式的结构,感谢任何来源

Ps.:如果问题的某些部分可以很容易地用谷歌搜索,我深表歉意,但我试过了,没有任何东西可以详细描述这一点。

非常感谢!!

【问题讨论】:

  • 不是当你说砍掉你的意思是“缩短”序列?除非您将它们同步并可能切掉指定范围之外的频率,否则这将完全破坏立体声。如果不是,您想要什么频率而不是范围内的值。
  • 我想完全去除指定频率内的任何声音。因此,如果指定的频率为 300-400hz,则该范围在输出文件中应该完全为空。是的,我知道输出听起来绝对很糟糕,但这与它的声音无关。

标签: c audio


【解决方案1】:

答案:

  1. FFmpeg 做了很多音频切片和切块,它是用纯 C 编写的。不过它相当大,可能很难一口气消化。
  2. “音频编程”有点含糊。但从你的问题的其余部分,听起来你想从磁盘打开一个音频文件,对音频应用一些转换,然后将数据写入一个新文件。 (“音频编程”范围内的其他领域包括访问特定于平台的 API 以从麦克风读取并将音频写入输出设备)。
  3. 又是一个宽泛的话题,但我们将从简单开始。

我建议首先获取(或生成)一个 .WAV 文件。 WAV 文件可能是手动读写的最简单的音频文件。 Here is a page that describes what you need to know about the WAV format.

脉冲编码调制 (PCM) 是最简单的音频格式,因为您无需担心先对其进行解压缩。 Here is a page (that I wrote) describing different PCM formats.

至于过滤和切割不同频率,我认为您正在寻找的是low-passhigh-passband-pass 过滤器。

我希望这可以帮助您入门。根据需要在 Stack Overflow 上提出更多问题。

【讨论】:

  • 非常感谢!这应该让我忙一阵子。 FLAC 或 MP3 文件的过滤器是否比 WAV 更难编码?到目前为止,我的印象是 WAV 更难以理解,但该页面非常清楚地说明了它!谢谢!
  • Ps.:您发布的有关 WAV 格式的网站的一部分我不清楚。 “8 位样本存储为无符号字节,范围从 0 到 255。16 位样本存储为 2 的补码有符号整数,范围从 -32768 到 32767。”这是我唯一确定为频率的部分,但没有迹象表明 -32768 代表什么频率或 32767 代表哪个频率。而且我似乎也找不到任何关于幅度如何表示的信息。可能只有我一个人,它在文本中的某个地方,如果是的话,很抱歉。非常感谢!
  • WAV 作为一种容器格式比 FLAC 或 MP3 更容易分解。另外,对于后者 2,您需要解压缩内部的音频以获取原始 PCM。在 WAV 中,您可以从原始 PCM 开始。至于 0..255 或 -32768..32767,这些是样本范围,而不是频率。 PCM 波由一系列代表离散波振幅的样本组成。例如,对于 44100 Hz 的 16 位样本,每秒音频将存储 44100 个 16 位样本(如果是立体声数据,则为两倍)。
  • 好吧,所以 SampleRate 是如文章所说的那样预定义的——这是否意味着如果它在 44100,一切都以 44100hz 的频率播放,并且感知的音高是一种“副产品”幅度?那么对于 22050hz 的纯音,每一秒 Sample 都会静音? (我想我真的需要拓宽对计算机生成声音的理解。)
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多