将值和时间列表转换为音频文件

信息处理 声音的 时间序列 阵列信号处理
2022-02-06 08:45:31

我有两个 pandas 数据帧,一个以秒为单位,一个以实际音频数据(值从 -1 到 1)。

音频数据点不是等距的,这就是为什么我需要以秒为单位的时间列表。

这是两个数组的简短示例:

  1. 以秒为单位的时间:
0.000934
0.004197
0.005921
0.006978
0.007306
0.009449
0.012022
0.024245
0.030468
0.038149
  1. 音频数据点:
0.446907
0.432984
0.410248
0.385579
0.363269
0.343606
0.328705
0.309281
0.285214
0.268380

如何将它们转换为音频文件?

3个回答

我认为这里的方法是过采样、低通滤波和可选的连续下采样。这个过程将产生等距的音频数据。

1. 过采样

选择一个目标过采样周期和对应的过采样频率远低于,这是数据中出现的最短时间距离。你走得越高,你犯的错误就越小。根据简短摘录,我的猜测是的 48kHz就足够了,但可以随意选择 96 甚至 192kHz。创建一个长度为零的数组,其中是音频数据的长度(以秒为单位)。Tosfos=1/TosTminfoslfosl

然后,将您的时间值除以并将结果四舍五入到最接近的整数(ceil/floor)。(这是引入错误的地方。)接下来,使用时间数组中的整数作为索引,将音频样本放入零数组中。Tos

2.低通滤波

应用一个截止频率的陡峭低通滤波器。结果将是您通过过采样创建的稀疏信号的插值版本。fc=1/2Tmin

3. 下采样(可选)

如果您愿意,请再次对信号进行下采样。这可能需要另一个低通滤波,具体取决于您希望的采样率。

4. 将数据写入文件

将数据写入 wav 文件或您选择的任何其他格式。您需要向函数提供采样率。

异步重采样器应该可以解决问题。

基本上将连续时间窗 sinc 定位在所需的(均匀)输出时刻,通过输入时刻的邻域对其进行采样,选择 sinc 宽度(带宽的倒数)作为最大输入间样本间距的函数,或局部作为样本密度的函数。

除非样本密度变化很大或质量要求非常高,否则您可能会使用更简单的方法。对于某些应用,简单的线性插值可能就足够了。对于具有音调组件的高质量音频应用程序,这可能会导致严重的听觉伪影,但我很难想象采样时间显着变化的高质量音频应用程序?

编辑:一个简单的 MATLAB 代码片段可能会满足您的需要:

t1 = [0.000934,0.004197,0.005921,0.006978,0.007306,0.009449,0.012022,0.024245,0.030468,0.038149];
x1 = [0.446907,0.432984,0.410248,0.385579,0.363269,0.343606,0.328705,0.309281,0.285214,0.268380];
max_fs = 48e3;
fs = min(1/min(diff(t1)), max_fs);
[x2, t2] = resample(x1, t1, fs);

figure
plot(t1, x1, '*')
hold on
plot(t2, x2, '-')
hold off

请注意,我没有费心去深入研究文档来查看细节。我确认输入点和输出点之间存在一些形状相似性,并假设实现是明智的。

尽管我不能直接为您的问题提供解决方案,但我想我可以为您指出“最完善”的方法。

据我所知,非均匀采样(如果您以某种通用方式对时间和空间感兴趣)与通过插值进行的均匀采样有关。我相信“最简单”和最直接的方法是采用拉格朗日插值方案。另一方面,Max 和 Knut Inge 都提出了非常相似的方法(我只是在这里明确说明)。

我无法真正评论这两个过程之间的关系,如 Max 建议的最后阶段可能的下采样重新采样,并直接对原始数据进行插值以获得它的统一采样版本。有关更多信息,您可以查看Wikipedia 页面和(在我看来更好)Farokh Marvasti 编辑的“非均匀采样 - 理论与实践”一书。我相信第 3 章(如果您不熟悉拉格朗日插值)、第 4、5 和 16 章应该与您的问题相关。

很抱歉,我无法直接回答您的问题,希望您能找到可行的解决方案。