降低pcm音量后产生奇怪的噪音
strange noise after reduce volume on a pcm
有人知道为什么我在c++中应用这个算法来降低pcm的音量后,背景中会出现白噪声吗?
for(int i = 0; i<pcm.length(); i+=2) {
quint16 byte0 = pcm[i];
quint16 byte1 = pcm[i+1];
//merge byte0 and byte1
qint16 n = (byte1 << 8) + byte0;
n *= volume; // multiplier;
//split n into byte0 and byte1
byte1 = (n >> 8) & 255;
byte0 = n & 255;
//save the new values
pcm[i] = byte0;
pcm[i+1] = byte1;
}
过了很长时间,我找到了解决方案。问题是我把两个片段融合在一起的模式。
for(int i = 0; i<pcm.length(); i+=2) {
quint16 byte0 = pcm[i];
quint16 byte1 = pcm[i+1];
//merge byte0 and byte1
qint16 n = 0;
n |= speakersRaw[j][i+1] & 0xFF;
n <<= 8;
n |= speakersRaw[j][i] & 0xFF;
n *= volume; // multiplier;
//split n into byte0 and byte1
byte1 = (n >> 8) & 255;
byte0 = n & 255;
//save the new values
pcm[i] = byte0;
pcm[i+1] = byte1;
}
您的n *= 0.5
实际上和n >>= 1
做得一样。您正在将byte1
的最低有效位转换为byte0
的最高有效位,这可能是您的噪声源。
为什么要将这两个值合并为一个整数,而不是分别处理?
也许您的字节打包和拆包顺序不对?
qint16 n = (byte0 << 8) + byte1;
byte0 = (n >> 8) & 255;
byte1 = n & 255;
Mark Ransom提到的字节顺序是一个明显的可能问题。你应该检查一下。
另一个可能的问题是符号扩展。
如果您有带符号的样本,并且您正在以无符号类型操作它们,那么您将丢失所有负样本的符号位。
如果你的字节类型是有符号的,那么当你加载字节0和字节1时,你会得到高字节的符号扩展,同样不是你想要的。
quint16
类型与样品的实际类型匹配吗?如果没有,则应使用相同的类型。您应该让用户使用unsigned char
作为字节类型。
根据评论中的信息更新:
要测试符号扩展理论,请更改:
n *= 0.5;
线路至:
n = ((short) n) * 0.5;
相关文章:
- C++ - 对 PCM::getInstance() 的未定义引用问题
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- 捕获音频数据并保存到AudioFlinger中的原始PCM文件
- 如何将 WebM 文件解码为原始 PCM?
- 在哪里可以从Android框架中获取原始的PCM数据
- 配置 AVCodecContext 结构以从原始 PCM 编码到 u-law
- FFmpeg - 重新采样的音频,噪音很大
- 如何使用GStreamer播放PCM数据数组
- MPG123将mp3解码为C 中的PCM
- 如何使用IMFSinkWriter编写内存PCM数据
- 如何在C++中为PCM缓冲音频添加音效
- 在 C/C+ 中从 16 位线性 PCM 音频转换为 32 位浮点数的最佳方法
- C++ 是使用 OpenAL 进行实时 PCM fft 音频处理
- 如何创建PCM签名的16位WAV文件
- C 关于Intel PCM源代码#ifndef intelpcm_api #define intelpcm_api
- FFmpeg:编码PCM 16音频数据分配错误
- 写入 8 位 PCM 正弦波波形文件会产生泛音
- 滤除噪音和速度值的变化
- 尝试混合两个PCM音频源
- 降低pcm音量后产生奇怪的噪音