C++ 从44100到96000 Hz的音频上采样和线性插值

C++ 从44100到96000 Hz的音频上采样和线性插值,c++,audio,linear-interpolation,sample-rate,C++,Audio,Linear Interpolation,Sample Rate,我试着把采样频率从44100赫兹提高到96000赫兹,我已经试过了 sum1 = mPastWavBuffer[(int)mOffset]; sum2 = mPastWavBuffer[(int)mOffset+1]; double sum = (sum1 + (sum2-sum1)) * (mOffset-(int)mOffset); mOffset是一个双精度值,它包含递增的阶跃因子,以便在44100 Hz样本文件中移动并使其成为96000 Hz。这个线性插值是从维基上取的,但这并没有给我

我试着把采样频率从44100赫兹提高到96000赫兹,我已经试过了

sum1 = mPastWavBuffer[(int)mOffset];
sum2 = mPastWavBuffer[(int)mOffset+1];
double sum = (sum1 + (sum2-sum1)) * (mOffset-(int)mOffset);
mOffset是一个双精度值,它包含递增的阶跃因子,以便在44100 Hz样本文件中移动并使其成为96000 Hz。这个线性插值是从维基上取的,但这并没有给我想要的结果,听起来很糟糕

我在这里用错了吗?或者如果不是这样用的话,我该怎么处理这个公式


摩根,这可能是因为线性插值并不是你想要的。如果您只是将采样率增加一倍,它可能会运行得相当好,但是如果您得到了好的结果,使用非整数因子,我会感到惊讶

我建议要么尝试高阶多项式插值,要么在频率空间中做一些事情(第一个比第二个容易)

编辑:从评论中,我还注意到您的总和计算已关闭:

double sum = sum1 + (sum2-sum1) * (mOffset-(int)mOffset);

是你想要的。

应该是
x+s*(y-x)
。。。x=起点(sum1),y=终点(sum2),s=百分比(mOffset-(int)mOffset))…我猜(s是百分比)
(mOffset-(int)mOffset)
看起来不对。它与sum1/sum2相关吗?@Dave我想我必须再次检查我的发现。@user2864。。我想我的答案是肯定的,但我可能把你弄错了。@user2864740:这是正确的,但通常使用
modf
+1进行编辑。我认为你关于线性插值的警告在使用更高的速率时有点过于严厉。我还没试过,但我敢打赌你甚至不会注意到它不完美。我没想到它会那么糟糕,显然我错了。一阶多项式是线性插值,什么阶可能好,五阶?对我来说,最大的问题是理解数学中所有的希腊符号,这就是我在谷歌上搜索时所能看到的一切。@Mark这正是我在进行线性插值时的想法,它不应该是一个很大的模糊。你认为我可能做错了什么?因为我得到的结果很糟糕,非常糟糕。这里的问题是,当进行上采样时,需要一个低通滤波器,截止(理想情况下是砖墙)在原始信号的Nyquiest极限。线性插值实际上是一个2抽头FIR,很可能它的截止位置错误,响应很差。@Morgan,我做了自己的实验,看看线性插值有多差,我听不到区别。包含44100hz采样率下440 hz音调的2秒,接下来的2秒是插入到44100hz的20258hz采样(与44100到96000的比率相同)。我用来生成示例的程序是。你的问题似乎不在插值范围之内。