相关疑难解决方法(0)

你如何对重新采样的音频数据进行双三次(或其他非线性)插值?

我正在编写一些以不同速度播放WAV文件的代码,因此波浪要么慢,要么低音,要么更快,音高更高.我目前正在使用简单的线性插值,如下所示:

            int newlength = (int)Math.Round(rawdata.Length * lengthMultiplier);
            float[] output = new float[newlength];

            for (int i = 0; i < newlength; i++)
            {
                float realPos = i / lengthMultiplier;
                int iLow = (int)realPos;
                int iHigh = iLow + 1;
                float remainder = realPos - (float)iLow;

                float lowval = 0;
                float highval = 0;
                if ((iLow >= 0) && (iLow < rawdata.Length))
                {
                    lowval = rawdata[iLow];
                }
                if ((iHigh >= 0) && (iHigh < rawdata.Length))
                {
                    highval = rawdata[iHigh];
                }

                output[i] = …
Run Code Online (Sandbox Code Playgroud)

audio interpolation signal-processing resampling bicubic

16
推荐指数
2
解决办法
1万
查看次数

以编程方式增加音频样本数组的音高

你好,音频计算世界的人,

我有一系列样本可以呈现录音.让我们说它在44100Hz时是5秒.如何以更高的音高播放这个?是否可以动态增加和减少音高?就像让音调慢慢增加到速度加倍然后再下降.

换句话说,我想录制并播放它,好像被dj"划伤"一样

伪代码总是受欢迎的.我将用C写这篇文章.

谢谢,


编辑1

请允许我澄清我的意图.我想将播放保持在44100Hz,因此我需要在播放前操作样本.这也是因为我想要将音调增加的音频与以正常速率运行的音频混合.

用另一种方式表达,也许我需要以某种方式在相同数量的样本上缩小音频?这样播放时听起来会更快吗?


编辑2

另外,我想自己这样做.请不要图书馆(除非你觉得我可以选择代码并找到有趣的东西).


编辑3

用C语言编写的一段代码示例,它带有2个参数(样本数组和音高因子),然后返回一个新音频数组就太棒了!


PS我开始对此表示赏心,不是因为我认为已经给出的答案无效.我只是觉得在这个问题上获得更多反馈会很好.



获得奖项

老实说,我希望我可以将赏金分配给几个不同的答案,因为我认为这些答案非常有用.特别感谢丹尼尔向我传递了一些代码,而AShelly和Hotpaw2则提供了如此详细的回复.

最终,虽然我使用了数据专家引用的另一个SO问题的答案,因此该奖项归他所有.

再次感谢大家!

audio signal-processing pitch

12
推荐指数
2
解决办法
9496
查看次数