關於 線性反饋移位暫存器 介紹如下....
https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E5%8F%8D%E9%A6%88%E7%A7%BB%E4%BD%8D%E5%AF%84%E5%AD%98%E5%99%A8
要先大概知道這是啥....
http://belogic.com/gba/channel4.shtml (雖然這以gameboy advance為教學,但這塊觀念部分與gb互通,實際上gba的sound系統有部分就是沿用gb硬體....)
總之gameboy sound channel 4 用來產生 "模擬" white noise 的輸出,什麼是white noise ??
https://en.wikipedia.org/wiki/White_noise
最簡單的結論就是white noise可以想像成一堆聲音的雜訊,像是廣播沒調準頻道或是傳統電視沒調整到有效頻道所發出的ㄘㄘ聲就是white noise的表現...可視為無規則性亂數產生的雜亂訊息.
這在gb上是channel 4的表現效果,不過gb的white noise並不是真正的完全的隨機亂數(如何用公式或一定的規則算法輸出亂數,滿高深的數學問題...,這邊是用硬體作簡單模擬輸出),而是利用LFSR產生的模擬輸出,由於離開學校久了...剛開始看這塊,真的看得一頭霧水,查了一些資料想了想後,才大概搞清楚這輸出的主要規則,但整個GB SOUND輸出模擬,還有很多地方搞不太懂(跟畫面同步的觀念和模式? 頻率與真正輸出取樣無法整倍數? 超過一般CD 44.1kHZ的超高頻是要怎樣處理?? ),這篇先整理這塊心得.
簡單來說就是 CHANNEL 4 有兩個輸出 模擬亂數的參數, 用 7個 或是 15個暫存器位移記算,來產生模擬亂數續列(之所以說模擬,是因為它的輸出其實是會循環的,不過之後都簡化成亂數輸出稱呼).
先以 7個暫存器的說明範例....
7個暫存器的狀態可以想像成7個連續的bits , bit 7 ~ bit 1 (最低位這邊以bit 1稱呼) ,初始化每個bit都為1,所以為1111111,每一次輸出亂數的過程經過底下幾個步驟
1.輸出最右端的bits當成亂數輸出續列
2.資料右移 >> 1 位,
3.最高位以 bit 1 與 bit 2 的 exor 運算結果填補
4.得到新的 7bits 序列 , 回去 步驟一循環運作
下面C#部分的範例code
byte LSFR = 0x7f; //init 1111111
for (int i = 0; i < 1024; i++) //執行 1024次
{
string b_str = Convert.ToString(LSFR, 2).PadLeft(7, '0');
listBox1.Items.Add(b_str + " " +LSFR.ToString()); //
byte b1 = (byte)(LSFR & 1);
byte b2 = (byte)((LSFR & 2) >> 1);
LSFR >>= 1;
LSFR |= (byte)((b1 ^ b2) << 6);
}
不過channel 4 , 我還有頻率對應輸出的規則沒搞懂...先這樣.
原本以為channel 4 應該是最好k的部分,相比下其實前面1.2.3還容易點.
印象中以前學生時候有學到LFSR這東西,但現在都忘光光了,補回,
ps.LFSR有各種實作的方式,大概都大同小異,這邊僅針對GB硬體的方式來處理,包括像是幾個暫存器,初始值.用哪2個位元來做EXOR填補都可以是變化之一.
比起模擬器cpu.gpu.mem等等實作,我覺得apu聲音輸出這塊對一般人來說最難搞懂,也最難完全實做正確.
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言