2016-07-04 52 views
1

我一直在經歷堆棧溢出的帖子,但我不理解如何從麥克風中抓取我的音頻中去除嘶嘶聲。從16位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'?我也不熟悉你提供的LPF,因爲'out_sample'取決於你以前的所有樣本。您還應該意識到,您在時域內而非頻域內「移動」。 – Logman

+0

您擁有的是具有緩慢指數衰減的IIR(無限脈衝響應)濾波器。這是一個非常沉重的LPF。另外,數據的結構需要更清楚。 sample_size/2表明你正在處理可能是交錯的立體聲數據,這是PCM的典型特徵,但是你的代碼沒有顯示出來。這會讓事情變得非常糟糕。 – doug

+0

此外,還有免費的應用程序會向您顯示麥克風噪音的頻譜。你應該根據這個值來支付你的LPF。此外,可以在相對安靜的時段應用動態增益,以最大限度地減少噪音。這些都不是很難,但你可能應該得到一些工具來生成所需的過濾器。 Octave或Matlab擅長這一點。 – doug

回答

2

PCM數據幾乎總是簽署數據。您可能會看到每個負值突然被視爲巨大值(> 32768)的影響。然後通過您的「低通濾波器」將其作爲雙精度值進行濾波。假設您的DC偏移量爲零,那麼您的濾波器將產生接近32768的DC平均值,但在頂部會出現一個相當難以預測的聲學信號。

相關問題