2009-12-12 163 views
0

我實現了一個基本的Karplus-Strong算法。
充滿白噪聲的鈴緩衝器從前面輸出一個採樣,並將前兩個元素的平均值添加到末尾並刪除第一個元素。重複上一步到步驟。用低通濾波器擴展Karplus-Strong

爲了獲得更好的結果並對它們進行控制,我嘗試實現該算法的擴展版本。
因此,我不需要平均濾波器,而需要像低通濾波器那樣的頻率濾波器。
我的平均濾波器有兩個輸入和一個輸出:avg(a,b)=(a + b)/ 2

維基百科頁面上的示例代碼給出了與輸入一樣多的輸出。
http://en.wikipedia.org/wiki/Low-pass_filter

我發現其他(數學)版本,如:
http://cnx.org/content/m15490/latest/
H(Z)=(1+(1/Z))/ 2
我想z是複數。

兩個版本都有兩個輸入,但也有兩個輸出。
如何從中獲得一個有意義的值?
還是我必須重寫算法的更大的部分?
如果是這種情況,我可以找到一個很好的解釋嗎?

回答

2

您的過濾器是有限衝擊響應過濾器的一個特殊功能。您正在使用moving average method來選擇係數,使用N = 1。它已經是一個低通濾波器。

計算係數和爲了使過濾器來調諧到一個特定的頻率響應涉及棘手的數學。最好的辦法是使用軟件包來計算係數,如果移動平均數不符合您的賬單。 Matlab是通常的選擇,GNU Octave是一個開源選項。

+0

感謝您的回覆。 我不知道我已經在使用低通濾波器。 然後我需要一個更高級的參數。 感謝提示,以計算係數和順序。 我會在將來使用它。 但目前的問題是執行這樣一個過濾器。 – 2009-12-12 21:13:52

+0

這個實現非常簡單:y = c0 * x [0] + c1 * x [1] ...爲c設置好值是最難的部分。 – 2009-12-12 22:31:42

+0

是的,這很簡單。也解釋了爲什麼平均值是低通濾波器。 (a + b)/ 2 => 0.5 * a + 0.5 * b。問題回答並被接受。我想高和樂隊低音是相當簡單的?如果是的話,你也可以寫這些算法? – 2009-12-12 23:00:19

0

過濾器可以以多種方式表達:

  1. 在複平面,您的示例H(Z)=(1+(1/Z))/ 2
  2. 作爲過濾器,y[i] = h[0]*x[i] + h[1]*x[i-1] + h[2]*x[i-2] + ...
  3. 在頻域中,Y [F] = H [F] * X [F]

的這些第二實際上是H而X陣列的卷積。這也是最容易理解的。

上一個答案解釋了從哪裏開始構建過濾器。假設你的濾波器係數是h,那麼它只是對非負數進行求和。

我相信我明白你在問什麼。儘管你不需要超過一個輸出。從維基百科頁面的Karplus組-斯特朗串合成算法需要長度L的緩衝如果我們具有M個濾波器係數(h)給出形式的輸出,

y[i] = x[i] + h[0]*y[i-L] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...

的Karplus組-斯特朗合成從here使用環形緩衝區來保存最後的L個輸出,y[i-1],...,y[i-L]。這初始化爲i<=Lx[i]噪聲值;然而,對於i>Lx[i]=0。由於您只存儲L值,因此算法將具有空間效率。 i>L的信號x[i]僅添加到環形緩衝區。

最後,作爲警告的提示,如果您對係數h的數量和值y的輸出值可能不具有所需的行爲都不小心。

+0

我對這個東西幾乎一無所知,所以也許我錯誤地實現了它。我使用了下面的解釋:http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html(不是我的作業),並且根據這個說明,緩衝器被用作延遲和反饋。此外,更新步驟只需要兩個輸入。 生成的音頻聽起來像一把吉他。如果您仍然認爲應該使用緩衝區中的所有值,那麼您能否進一步解釋? – 2009-12-13 00:17:33

+0

我正在瀏覽[Wikipedia page] [1]的論文。它具有'y [n] = x [n] + 0.5 *(y [nN] + y [n-(N + 1)])'而不是y [n] = x [n] + 0.5 *(y [n-1] + y [n-2])'這就是我所設想的。所以你對緩衝區的構建方式看起來是正確的。普林斯頓頁面也增加了緩衝區中的平均值0.996的衰減。我沒有看到任何理由,你不能只有兩個元素一起過濾。但是你的里程會有所不同,所以你必須試驗一下,聽起來最好。 [1] http://www.jstor.org/pss/3680063 – 2009-12-13 21:08:06

+0

我編輯了我的答案,以糾正我的誤解。 – 2009-12-13 21:35:04