2008-11-03 55 views
2

我想知道這樣的事情是否可行(並且相對容易),如果是這樣,我該怎麼做?可以使用DirectSound輕鬆進行帶狀濾波嗎?如果不是,我該怎麼做?

我願做一個波形文件,我複製帶濾波。類似於大多數類似Winamp的應用程序中的「均衡器」。
然而,我的想法不是要平衡聲音,而是要使用非常高的負dB值,幾乎殺死我正在過濾的頻段。

第一個問題是:是否DirectSound的給我的東西,可以讓我做到這一點?
如果不是:你將如何執行此操作?
我知道(儘管我完全不完全理解它),您可以使用快速傅里葉變換從採樣波形轉換爲頻率分佈。現在,我顯然不能再從該分配回原來的波形改變某些頻率的幅度值:-)

我怎麼會做這樣的事情之後?

另外,我可以製作這些過濾器有多精確? (如果我要過濾掉一切從2250Hz到2275Hz,這將是錯誤的過濾器會呢?會的最大精度,我可以得到取決於什麼?)

謝謝!

回答

3

我不知道的DirectSound提供了這個功能,我認爲它不會因爲DSP是相當複雜的,往往是從形勢變化很大,以情況。你想要做的是在DSP(數字信號處理)中通常稱爲「濾波」。很多時候這涉及使用FIR(有限脈衝響應)濾波器。有很多圖書館可以做你想要的東西。關於濾波器設計最棘手的方面是總是存在速度,精度和誤差之間的折衷。在你的例子中,你將能夠消除頻率之間的信號,但這也會影響周圍的頻率。它會影響的數量與處理時間和濾波器設計有關。

也許從這裏開始(數學重度):FIR Filter

然後爲自己的Windows/DirectSound的特定FIR相關信息

1

DirectSound根本沒有信號處理設施。有許多技術可以用來做你想做的事。可以使用FFT來做你想做的事情,但它可能不是最好或最簡單的方法。您應該閱讀音頻DSP,特別是數字濾波(IIR,FIR)。在線免費提供了一本名爲The Scientist and Engineer's Guide to Digital Signal Processing的DSP書,這絕對值得一看。也有可以從亞馬遜的許多其他優秀的DSP書籍等

2

的DirectSound沒有做帶通濾波谷歌像你描述的在這裏,因爲據我所知。

後面的帶通濾波的一般想法是使用延遲線,內搭信號輸出後,反饋到輸入流,具有指定的延遲時間和衰減(或衰減)的因素。仔細設計濾波器可以讓您放大或衰減音頻源中的特定頻率範圍。請注意,此技術不使用FFT,除了在測試濾波器效果時可能是診斷工具。 FFT技術可以更精確地限制或放大頻率,但延遲線通常更快(並且更容易編碼)。

要處理的WAV文件(而不是做實時合成/濾波),執行對音頻緩衝延時線很簡單,只要:

for (int i = 0; i < samples.Length - delay; i++) 
{ 
    samples[i + delay] += samples[i] * decay; 
} 

它在比這更復雜一點練習(例如,您必須處理潛在的溢出值,並且某些類型的延遲線必須反向運行,當然這在C風格編碼中總是很痛苦)。

就過濾器的精確程度而言,這取決於它的設計程度(這非常困難)。當您使用延遲線設計濾波器時,您基本上正在做與電氣工程師在便宜的微處理器之前幾十年(並且仍然這樣做)相同的事情。

1

我不知道任何直接處理這類事情的庫。

你可以實現你想要的傅里葉變換,實現如FFTW你,但在我的experiance做的計算工作是非常討厭的工作,並且使用的內存數量龐大,特別是如果你要處理更長一擊中的音頻位。

使用FFT應用等式的基本思路是這樣的:

  1. 讓您的聲音。音頻只是一個非常長的數值(樣本),這是揚聲器錐體的位移/隨着時間的推移。
  2. 對音頻進行傅立葉變換(庫文件將執行此操作,但您必須將音頻採樣轉換爲正確的格式。這將基於時間的採樣轉換爲基於頻率的採樣 - 實質上是將信號轉換爲顯示frequenceies的distrobution在信號
  3. 鴻溝頻率分佈狀態了 - 分裂distrobution成多個區域,每個區域將是頻率的範圍
  4. 然後,您可以在頻段進行調整 - 爲你的榜樣,你可以將一個區域清零以除去所有的痕跡
  5. 對更新後的頻率分佈進行傅立葉逆變換,這會將表示返回到t他的時域,重建原始信號的(近似),但與您所做的調整。

做這樣的事情可以讓你準確地操縱音頻中出現的頻率,給你一種你似乎想要的控制。不過要注意的是,這不是直接執行。

我建議圍繞這個問題閱讀。節拍檢測與許多此類節目密切相關(大量使用基本技術) - 以前幾部分here作爲開始。

希望有所幫助。

0

DirectSound可能不直接支持這個,但DirectShow應該。你可以用這個API來代替嗎?

0

我第二個FIR濾波器的想法。爲了獲得狹窄的缺口,你需要一個很長的過濾器內核。

基本上你使用輸入流與一組值(內核)的卷積。每個輸出採樣是前N個採樣與濾波器內核中相應條目的乘積之和。

所以你需要保持一個內核數組和一個相同數量樣本的FIFO或循環緩衝區。

他們是網絡上的FIR濾波器內核計算器,只是谷歌「FIR濾波器計算器」。

0

你應該能夠做一個FFT,在頻域(縮放頻率倉)中搞亂,然後做一個IFFT來恢復時域信號。否則,使用ScopeFIR或MATLAB設計濾波器非常容易。 ScopeFIR可以輕鬆設計帶阻濾波器並給出係數,因此您可以對信號進行卷積。以下是ScopeFIR網站的教程:http://www.iowegian.com/fir/tutor/firintro.htm

相關問題