C++ 将原始音频从 22050 上采样到 48000 Hz

Posted

技术标签:

【中文标题】C++ 将原始音频从 22050 上采样到 48000 Hz【英文标题】:C++ Upsampling raw audio from 22050 to 48000 Hz 【发布时间】:2013-05-05 07:22:12 【问题描述】:

我有

形式的原始音频数据
vector<short> m_shorts;

音频数据为 22050 kHz 单声道。

有人知道我如何(没有任何第三方库)快速将短向量转换为 48000 Hz 单声道吗?

我知道它不会改善声音。这仅用于将音频数据传递给效果器(更高的采样率听起来更好)。

感谢您的帮助。

【问题讨论】:

您想要44100Hz22050Hz 的双倍)还是48000Hz?而kHz 很可能是一个错字,应该是Hz @Basile Starynkevitch 对不起,你是对的。我想我更喜欢 48000 Hz。但如果 48000 不容易实现,44100 也可以。 那么请相应地编辑您的问题。 为什么不想使用外部库? 【参考方案1】:

如果您想将采样频率从 22050Hz 加倍到 44100Hz(即 22050 的两倍),您可以做一些 linear interpolation:

vector<short> m_shorts;
vector<short> outputs;
unsigned inplen = m_shorts.length();
output.resize(2*inplen+1);
for (unsigned ix = 0; ix < inplen; ix++)  // not sure of the bounds
  output[2*ix] = m_shorts[ix];
  output[2*ix+1] = (m_shorts[ix] + m_shorts[ix+1])/2;

但我不是音频或信号处理专家。可能有更聪明的方法......(可能是 Fourier transform 然后是逆傅里叶)。

而且我不确定“听起来会不会更好”。

【讨论】:

线性插值有效,但效果不佳。理想情况下,应使用适当的重采样滤波器。 这种过采样操作会导致 11.025kHz 到 22.05kHz 范围内的不需要的信号内容在原始文件中不存在(称为混叠或图像)。在所有实际的上采样设计中,LPF 都会消除这一点。这里使用的两点插值是一个非常粗略的 LPF,它的截止频率很可能在错误的位置和一个非常宽的阻带。结果是大量的混叠正在发生。您需要一个重采样滤波器,其拐点频率为 11.025kHz(或稍早一点)并且具有急剧的滚降。 线性插值可能适用于语音等内容,或者无论如何通过低质量设备播放。 @Marko 感谢您的评论。你没有任何 C++ 示例代码,是吗? @tmighty 我设计数字滤波器已经有好几年了,而且从第一原理来看并不是特别容易。我建议查看 VLC、GStreamer 等开源媒体播放器来重新采样代码。

以上是关于C++ 将原始音频从 22050 上采样到 48000 Hz的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NAudio 将原始音频从 WasapiCapture 重新采样到 g711 mulaw?

ffmpeg 限制音频采样率

如何在 Windows 10 上使用 C++ 将连续的原始音频数据记录到循环缓冲区中?

使用 NAudio 重新采样原始音频

如何重新采样 wav 文件

音频采样频率依赖于通道?