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 单声道吗?
我知道它不会改善声音。这仅用于将音频数据传递给效果器(更高的采样率听起来更好)。
感谢您的帮助。
【问题讨论】:
您想要44100Hz
(22050Hz
的双倍)还是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?