从16位PCM中去除c++中的音频噪声(嘶嘶)

Removing audio noise (hissing) in C++ from 16bit PCM

本文关键字:噪声 音频 嘶嘶 c++ 16位 PCM      更新时间:2023-10-16

我一直在浏览堆栈溢出的帖子,但我不明白如何从我的音频中删除从麦克风抓取的嘶嘶声。

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

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数据上做一个低通滤波器。有没有人能告诉我我做错了什么?

PCM数据实际上总是带符号的数据。你可能会看到每个负值突然被视为一个巨大的值(>32768)。然后通过"低通过滤器"将其过滤为双值。假设一开始你的直流偏置为零,你的滤波器将产生一个接近32768的直流平均值,但顶部有一个相当不可预测的和不具有声学意义的信号。