从 44100 到 96000 Hz 的音频上采样和线性插值
Posted
技术标签:
【中文标题】从 44100 到 96000 Hz 的音频上采样和线性插值【英文标题】:Upsampling audio from 44100 to 96000 Hz and linear interpolation 【发布时间】:2013-11-18 07:25:40 【问题描述】:我正在尝试将 44100 Hz 上采样到 96000 Hz,我已经尝试过了。
sum1 = mPastWavBuffer[(int)mOffset];
sum2 = mPastWavBuffer[(int)mOffset+1];
double sum = (sum1 + (sum2-sum1)) * (mOffset-(int)mOffset);
mOffset 是一个双精度值,包含递增的步长因子以在 44100 Hz 样本文件中移动并使其变为 96000 Hz。这个线性插值取自 Wiki Linear Interpolation from two known points 但这并没有给我想要的结果,这听起来很糟糕。
我在这里用错了吗,或者如果这不是使用它的方法,我应该用这个公式做什么??
问候,摩根
【问题讨论】:
应该是x + s*(y-x)
... x = 起点 (sum1), y = 终点 (sum2), s = 百分比 (mOffset-(int)mOffset)) ...我猜(s 是百分比)
(mOffset-(int)mOffset)
看起来不对。它与 sum1/sum2 相关吗?
@Dave 我想我必须再次检查我的发现。
@user2864.. 我想我的答案是肯定的,但我可能听错了。
@user2864740:没错,但通常使用modf
。
【参考方案1】:
这可能是因为线性插值并不是您真正想要的。如果您只是将采样率加倍,它可能会工作得相当好,但如果您得到良好的结果,我会感到惊讶。
我建议要么尝试高阶多项式插值,要么在频率空间中做一些事情(第一个比第二个更容易)。
编辑:从 cmets 我还注意到您的总和计算已关闭:
double sum = sum1 + (sum2-sum1) * (mOffset-(int)mOffset);
是你想要的。
【讨论】:
+1 表示编辑。我认为您对线性插值的警告在提高速率时有点过于苛刻。我还没有尝试过,但我敢打赌你甚至不会注意到它并不完美。 我没想到会那么糟糕,显然我错了。一阶多项式是线性插值,什么阶可能好,五阶?对我来说最大的问题是理解数学中的所有希腊符号,这就是我在谷歌上搜索时所能看到的。 @Mark 这正是我在进行线性插值时所想到的,它不应该是一个很大的模糊。你认为我可能做错了什么?因为我得到的结果很糟糕,真的很糟糕。 这里的问题是,在上采样时,需要一个低通滤波器,在原始信号的奈奎斯特极限处具有截止(理想情况下是砖墙)。线性插值实际上是 2 抽头 FIR,很可能是它的截止位置错误且响应糟糕。 @Morgan,我做了自己的实验,看看线性插值有多糟糕,我听不出有什么区别。 sample 包含 2 秒以 44100hz 采样率的 440hz 音调,接下来的 2 秒是内插到 44100hz 的 20258hz 采样(与 44100 与 96000 的比率相同)。我用来生成样本的程序是wav.py。您的问题似乎不在插值范围内。以上是关于从 44100 到 96000 Hz 的音频上采样和线性插值的主要内容,如果未能解决你的问题,请参考以下文章