【问题标题】:Load wave into array + Subtract channels + Save as wave/mp3将波形加载到数组中+减去通道+另存为波形/mp3
【发布时间】:2013-07-08 05:01:54
【问题描述】:

我有一个原始立体声音频文件。

它是树莓派降噪系统的一部分,麦克风 1 将主声音记录到左声道,麦克风 2 将周围的噪音记录到右声道。目标是从左通道中减去右通道。我会写我尝试过的东西,但如果另一种方法更容易,我不希望你坚持下去并插手它。

使用修改后的http://freedesktop.org/software/pulseaudio/doxygen/parec-simple_8c-example.html 版本进行录制。我将它输出到原始音频文件,这是一个有效的原始文件。立体声的优点是它们是同步的。在How to find the right RAW format 上查看我的其他问题。

总结一下:我该怎么做

  1. 将波形文件加载到数组中? (我问这个是因为在我的另一个问题中,波形格式似乎永远不对)
  2. 从左声道中减去右声道? (我假设 sample_left 减去 sample_right)
  3. 将其保存为原始或更好的 mp3 单声道。 (我可以管到跛脚)

【问题讨论】:

  • 我想你正在使用的库有read(或其他)函数,它返回读取数据的缓冲区?
  • @KiaMorot 请参阅stackoverflow.com/questions/17547110/… 的代码以供参考。我目前正在使用 sf_read_int。
  • 如果您目前只是在创建概念证明,请查看 Octave (gnu.org/software/octave)。它有大量的波处理功能来处理普通的负载 (gnu.org/software/octave/doc/interpreter/Audio-Processing.html),让你专注于让噪音消除工作(我认为让两个源同相至少会有问题)。
  • matlab 有wavread。此外,如果这些是实际的科学实验,请不要使用 mp3,而是使用 wav 或任何未压缩的东西。
  • @SlappyTheFish Octave 似乎是一个 GUI 以及资源匮乏。请注意,我使用的是 raspberry pi,它是一台速度较慢(按现代标准衡量)的计算机,您不应在其上运行 gui,以免进一步减慢速度。如果我错了,请纠正我。

标签: c raspberry-pi


【解决方案1】:

如果您将原始音频文件作为输入或从音频设备文件中读取原始音频样本,您可以执行以下操作

1.如果您使用文件提供原始音频数据,则以二进制格式打开原始音频文件并将原始数据读入缓冲区。 (或)从音频设备读取原始音频样本到缓冲区。

2.我们知道,在立体声音频格式中,右声道总是跟在左声道之后。因此,您可以简单地分离左右音频通道。例如,如果您的设备提供 16 位 pcm 脉冲,这意味着前 16 位是左声道,接下来的 16 位是右声道。

3.你可以简单地打开一个普通的二进制文件,你可以通过在文件的声明处定义wav头来将它变成一个wav文件。定义一个 wav 头并将音频数据写入 wav 文件。

wav 文件参考见here

【讨论】:

  • 我用打印字节的pastebin.com/iEvnv630 试过了。给定第一个和第二个字节为 16 位,我如何获得一个整数?拥有适当的单个整数,我如何转换回字节、位然后转换为新文件?
  • 每个采样率的位数是多少?
  • @Peak Reconstruction Wavelength,如果每个样本的位数是 16 位,则使用短整数从文件中读取数据,所有奇数样本为左通道,偶数样本为右通道。每次从文件中读取一个短整数时,使用一个计数器变量并递增它。根据计数器的值写入适当的文件。比如,如果计数器值为奇数,则将该数据写入左侧文件,如果计数器值为偶数,则将该数据写入右侧文件。
  • @Peak Reconstruction Wavelength,好的,现在我的工作有点忙...给我一些时间,也许明天我可以给你代码。
  • 到目前为止我有 pastebin.com/gL7F6KK4 但这经常会给出相当高的数字,这似乎并不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多