C++ 消除C+中的音频噪声(嘶嘶声)+;从16位PCM

C++ 消除C+中的音频噪声(嘶嘶声)+;从16位PCM,c++,audio,ffmpeg,C++,Audio,Ffmpeg,我一直在浏览堆栈溢出的帖子,但我不知道如何消除从麦克风中抓取的音频中发出的嘶嘶声 我实现了一个简单的低通滤波器,但我一定是做错了什么 unsigned short *buf = "audio data in PCM format"; double out_sample = 0; int sample_size = "number of samples of audio"; for (int n = 0; n < sample_size/2; n++) { out_sample =

我一直在浏览堆栈溢出的帖子,但我不知道如何消除从麦克风中抓取的音频中发出的嘶嘶声

我实现了一个简单的低通滤波器,但我一定是做错了什么

unsigned short *buf = "audio data in PCM format";
double out_sample = 0;
int sample_size = "number of samples of audio";
for (int n = 0; n < sample_size/2; n++)
{
    out_sample = (out_sample * 90 + buf[n] * 10) / 100;
    buf[n] = (unsigned short) out_sample;
}
unsigned short*buf=“PCM格式的音频数据”;
双输出_样本=0;
int sample_size=“音频样本数”;
对于(int n=0;n
上面的内容会产生非常糟糕的音频

我知道我需要对PCM数据进行低通滤波。谁能解释一下我做错了什么

unsigned short *buf = "audio data in PCM format";
double out_sample = 0;
int sample_size = "number of samples of audio";
for (int n = 0; n < sample_size/2; n++)
{
    out_sample = (out_sample * 90 + buf[n] * 10) / 100;
    buf[n] = (unsigned short) out_sample;
}

提前感谢。

PCM数据实际上总是有符号的数据。您可能会看到每个负值突然被视为一个巨大值(>32768)的效果。然后通过“低通滤波器”将其作为双值进行过滤。假设开始时直流偏移量为零,则滤波器将产生接近32768的直流平均值,但顶部有一个相当不可预测且声音不敏感的信号。

为什么
采样大小/2
?我也不熟悉您作为
out\u样本提供的LPF取决于您以前的所有样本。你也应该知道你是在时域而不是频域内“移动”的,你拥有的是一个指数衰减缓慢的IIR(无限脉冲响应)滤波器。这是一个相当重的LPF。此外,数据的结构需要更加清晰。示例_size/2表明您正在处理立体声数据,这可能是PCM的典型交错数据,但您的代码没有显示这一点。这会把事情搞得一团糟。此外,还有一些免费的应用程序可以向你显示麦克风发出的噪音频谱。你应该根据这个来计算你的LPF。此外,动态增益可在相对安静期间应用,以最小化噪声。这些都不是很难,但是您可能应该获得一些工具来生成所需的过滤器。Octave或Matlab擅长于此。