1
私はスタックのオーバーフローのポストを見てきましたが、私のオーディオがマイクから拾われている音からヒッシング音を除去する方法を理解できません。16bit PCMからC++でオーディオノイズを除去する
シンプルなローパスフィルタを実装しましたが、何か間違っている必要があります。
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データでローパスフィルタを作成する必要があることを知っています。誰かが私が間違っていることにいくつかの光を当てることはできますか?
ありがとうございます。
なぜ 'sample_size/2'ですか?私はあなたが 'out_sample'として提供したLPFに慣れていません。以前のすべてのサンプルに依存しています。また、周波数領域ではなく時間領域内で「移動する」ことに注意する必要があります。 – Logman
あなたが持っているのは、指数関数的減衰が遅いIIR(無限インパルス応答)フィルタです。かなり重いLPFです。また、データの構造を明確にする必要があります。 sample_size/2は、PCMの典型的なインターリーブされたステレオデータを扱っていることを示唆していますが、コードでは表示されません。これは物事をかなりひどく混乱させるでしょう。 – doug
また、マイクからのノイズのスペクトルを表示する無料アプリもあります。あなたはそれに基づいてLPFをテイラーする必要があります。さらに、雑音を最小限に抑えるために、比較的静かな期間に動的ゲインを適用することができます。これは非常に難しいものではありませんが、必要なフィルタを生成するためのツールが必要です。オクターブやMatlabはこれで良いです。 – doug