2016-07-04 20 views
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データでローパスフィルタを作成する必要があることを知っています。誰かが私が間違っていることにいくつかの光を当てることはできますか?

ありがとうございます。

+0

なぜ 'sample_size/2'ですか?私はあなたが 'out_sample'として提供したLPFに慣れていません。以前のすべてのサンプルに依存しています。また、周波数領域ではなく時間領域内で「移動する」ことに注意する必要があります。 – Logman

+0

あなたが持っているのは、指数関数的減衰が遅いIIR(無限インパルス応答)フィルタです。かなり重いLPFです。また、データの構造を明確にする必要があります。 sample_size/2は、PCMの典型的なインターリーブされたステレオデータを扱っていることを示唆していますが、コードでは表示されません。これは物事をかなりひどく混乱させるでしょう。 – doug

+0

また、マイクからのノイズのスペクトルを表示する無料アプリもあります。あなたはそれに基づいてLPFをテイラーする必要があります。さらに、雑音を最小限に抑えるために、比較的静かな期間に動的ゲインを適用することができます。これは非常に難しいものではありませんが、必要なフィルタを生成するためのツールが必要です。オクターブやMatlabはこれで良いです。 – doug

答えて

2

PCMデータは、実質的に常にと署名されたデータです。あなたは突然、大きな値(> 32768)として扱われるすべての負の値の効果を見ている可能性が高いです。これは、 "ローパスフィルタ"を介して二重の値としてフィルタリングされます。最初にDCオフセットがゼロであると仮定すると、フィルタは32768付近のDC平均値を生成しますが、予測不可能で、音響的に妥当ではない信号が上に表示されます。

関連する問題