momo zone

调核人的blog

Monthly Archives: 一月 2014

bcm5720 丢包

现象如下:

1. 收包方为DELL R720,板载BCM5720。centos 6.3,kernel linux-2.6.32-279。无任何应用程序收包(操作系统网络部分空转)。发包方和收包方直连,10w PPS不丢包。

2. 发包方为双上联,单下联的桥接模式时,10w丢掉一半的包。

3. ethtool -S 看不到任何异常情况,增大网卡的DMA接收环大小无改善。

4. 更新BCM5720驱动程序tg3无改善。

5. 调整硬中断平衡无改善。cpu负载几乎无。

原因追踪:
在tg3.c里的tg3_rx中发现包几乎都是在这个函数中被丢弃的。也就是说都是走到了drop_it标签。判断依据是desc->err_vlan中的高16位不为0,tg3.h里有描述高16位代表收包错误类型:

#define RXD_ERR_BAD_CRC			0x00010000
#define RXD_ERR_COLLISION		0x00020000
#define RXD_ERR_LINK_LOST		0x00040000
#define RXD_ERR_PHY_DECODE		0x00080000
#define RXD_ERR_ODD_NIBBLE_RCVD_MII	0x00100000
#define RXD_ERR_MAC_ABRT		0x00200000
#define RXD_ERR_TOO_SMALL		0x00400000
#define RXD_ERR_NO_RESOURCES		0x00800000
#define RXD_ERR_HUGE_FRAME		0x01000000

将tg3_rx修改为如下:

static int tg3_rx(struct tg3_napi *tnapi, int budget)
{
................
                opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
                if (opaque_key == RXD_OPAQUE_RING_STD) {
                        ri = &tp->napi[0].prodring.rx_std_buffers[desc_idx];
                        dma_addr = pci_unmap_addr(ri, mapping);
                        skb = ri->skb;
                        post_ptr = &std_prod_idx;
                        rx_std_posted++;
                } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
                        ri = &tp->napi[0].prodring.rx_jmb_buffers[desc_idx];
                        dma_addr = pci_unmap_addr(ri, mapping);
                        skb = ri->skb;
                        post_ptr = &jmb_prod_idx;
                } else
                        goto next_pkt_nopost;

                work_mask |= opaque_key;

                if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
                    (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {

                        if(net_ratelimit()){
                                printk("err:%x\n", desc->err_vlan);
                                printk("flag:%x\n", desc->type_flags);
                                if ((desc->err_vlan) & RXD_ERR_BAD_CRC)
                                        printk("RXD_ERR_BAD_CRC\n");
                                if ((desc->err_vlan) & RXD_ERR_COLLISION)
                                        printk("RXD_ERR_COLLISION\n");
                                if ((desc->err_vlan) & RXD_ERR_LINK_LOST)
                                        printk("RXD_ERR_LINK_LOST\n");
                                if ((desc->err_vlan) & RXD_ERR_PHY_DECODE)
                                        printk("RXD_ERR_PHY_DECODE\n");
                                if ((desc->err_vlan) & RXD_ERR_MAC_ABRT)
                                        printk("RXD_ERR_MAC_ABRT\n");
                                if ((desc->err_vlan) & RXD_ERR_TOO_SMALL)
                                        printk("RXD_ERR_TOO_SMALL\n");
                                if ((desc->err_vlan) & RXD_ERR_NO_RESOURCES)
                                        printk("RXD_ERR_NO_RESOURCES\n");
                                if ((desc->err_vlan) & RXD_ERR_HUGE_FRAME)
                                        printk("RXD_ERR_HUGE_FRAME\n");
                                if ((desc->err_vlan) & RXD_ERR_ODD_NIBBLE_RCVD_MII)
                                        printk("RXD_ERR_ODD_NIBBLE_RCVD_MII\n");
                        }
                drop_it:
                        tg3_recycle_rx(tnapi, tpr, opaque_key,
                                       desc_idx, *post_ptr);
                drop_it_no_recycle:
                        /* Other statistics kept track of by card. */
                        tp->net_stats.rx_dropped++;
                        goto next_pkt;
                }
                len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) -
                      ETH_FCS_LEN;
...............
}

发现desc->type_flags为0x10000000不属于tg3.h规定的任何类型。
到broadcom官方查看编程手册:https://www.broadcom.com/collateral/pg/5718-PG106-R.pdf

关于RXD的描述如下:

bcm5720_1
bcm5720_2
bcm5720_3
bcm5720_4

可以看到错误标志位的9-31位为保留且应该为0,但我看到的是却最高位被置1了。我真的不明白这是什么状况。最后看到里面说错误标志位只有在RXD的flag中的第10位为1时才有效。但修改后的代码跑的时候显示flag为0x0000300e,指示没有错误。我更加糊涂了,遇到的情况在文档中无法查证。既然他说没有错误,那么error flag最高位置1也就没有意义了(??!!)。我修改代码最终为:

if ((desc->type_flags & RXD_FLAG_ERROR) && (desc->err_vlan & RXD_ERR_MASK) != 0 &&
(desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {

.......

}

好吧这样不丢包了,而且收到的包也是正常的。这算是bug吗?如果是,我算是找到了一个存在已久的bug??

谈一下CDDA,jitter

关于jitter的讨论前些年有很多讨论,现在大多偃旗息鼓了。原因大概是大家手里有闲钱了,把大把钱投在HIFI上也不算浪费。现在平静下来的原因是:啊原来在我的系统上我根本听不出来区别,把钱投在手机上不是更划算。
总的来说,jitter对大多数人是玄学,原因是jitter原本就是数字信号处理的专业属于,一般人根本无法对他深入了解,包括我也在内。

jitter到底是什么,来点感性的认识。

上图就是CD(不光CDDA)的RF波形图,可见如果此物理盘片到RF输出之间有jitter,那么必然造成时域范围的相位偏移。

IMG_0841_cropped

右边的是低jitter的RF波形,左边的是高jitter的RF波形

谈到HIFI中的jitter必然要谈到CD播放器和转盘。这两个东西不是一个概念,前者相当于一部大众车,后者相当于一个相对更好一些的引擎。后者是前者的一个部件,但对于CD来说读取更稳定,更精准。CD播放器相对转盘多了一个重要部件就是DAC。

误区1,转盘+独立DAC比CD播放器音质好,原因之一是转盘稳定,误码率低
转盘稳定不稳定对误码率影响不大,jitter和误码率没有关系。也就是说jitter在一定范围内不会造成误码。就算造成误码,红皮书要求CD有校验纠错机制(CIRC)。

误区2,我把CD抓成WAV,抓10次,md5校验结果一样,所以CD放在转盘上还是放在一般CD上,jitter都一样大,没影响
使用PC抓轨,PC对待光驱的操作和CD播放器或转盘对待光驱的操作不同,最大的区别是PC会对校验错误的地方(扇区?桢?)反复读取,而CD播放器或转盘不会。另一个是抓轨本质上附带一个很大的缓冲,并且不涉及DAC,完全的数字处理过程,jitter在其中几乎没有影响。所以红皮书的要求能够保证CDDA的数据被完整复制和储存。

误区3,jitter听起来就像是破音
对于CD播放器和转盘来说,大量的jitter会造成误码且不可纠正,这的确会造成类似的破音。但这不是讨论音质的范围。实际上少量的jitter造成的是声音的失真。

DAC主要就是产生不同的电平信号,理想RF信号和实际RF信号(带jitter)的偏差将造成解码出来的电平信号的实际长度与理想的不同,也就是影响了模拟信号的拟真度,最终造成听感不同。有很多资料证明jitter影响最大的就是信噪比。可见对于CDDA系统,读取部分的jitter确实是造成音质变化的一个重要来源。但不要忘了,任何数字电路都会产生jitter。刨除读取部分的,最大的jitter就是DAC的时钟发生器。我个人觉得这个比其他的jitter源都重要。

再谈另一个方面,jitter较容易存在于同步系统中,比如CD转盘,DAC。即数据以流的方式存在,缺少中间的缓冲机制,任何jitter的加入在后面都不容易剔除。现在由于数字媒体播放器的加入,数据源到DAC都是异步方式传输的,比如usb audio 2.0,使用一个大的缓冲来异步传输数字音频流可以避免大多数jitter,对于回放系统而言仅有的jitter源就是时钟,DAC本身和电源了。我觉得现在讨论jitter对于一般人来说反而是一件非常out的事情,CD读入过程中的jitter在送入DAC后有很多方法可以降低,几乎到了不可闻的程度,追求1ppm精度的时钟的人都是什么心态啊。至今都没有人盲听听出来50ppm和1ppm区别的。

我觉得刨除传统的商业因素,CD媒介(包括SACD之类的),CD播放器和转盘将逐步退出主流HIFI圈,专业的高品质音频文件播放器将取而代之,HIFI的代价将大大降低。

DAC基础知识

一樣的顏料在不同畫家的手裡,可以創造出不同風格的畫作,同理,一樣的電子材料在不同設計師的手上,也可以變化出完全不同風格的音響產品。電子材料是死的,它們只有規格,必須透過音響電路設計師精心的搭配組合,才能賦予電子零件燦爛的生命。
您喜歡哪一種聲音?清清如水的,還是厚重濃郁的?每一種電子材料都有其電子數據上的特性,也有其獨特的音色,設計師在規畫電路之時,已經對兩者做了最基本的考量:電路要先能穩定動作,才講究如何控制調整音色。藉由不同的電路設計,設計師可以營造出該廠牌獨特的風味,這種例子在音響上屢見不鮮。

一套音響器材從頭至尾,都是藉由零件與電路的搭配,創造出屬於自己的特色。單單就數類轉換器這一件器材上,我們就可以觀察出音響設計師如何發揮創意,在線路架構與音色調整上所下的努力,他們各持不同的理論,以不同的手法設計出各式各樣的產品。有簡單的也有複雜的;有全IC的也有參雜電晶體與真空管的,就讓這一篇報導瀏覽一下設計師在數類轉換器上所發揮的創意。

為克服Jitter所下的努力

「Jitter」(時基誤差)一詞並不是在音響上所獨有的,Jitter存在於任何數位系統上,在數位系統上,只要Jitter的「量」在可容忍的範圍內,系統都可以正常運作。無論哪一套CD系統,都存在Jitter的問題,而這些Jitter也都合於系統可以忍受的範圍之內,因此即使明明知道系統內有Jitter的存在,CD轉盤與數類轉換器依舊可以正常無誤的工作。

Jitter的產生在於系統時基的不穩定,就像機械手錶一樣,會隨著溫度以及使用狀況時快時慢,產生不穩定的狀況。機械錶的時間誤差當然比電子錶大得多,電子錶依靠石英震盪器所發出的頻率工作,石英震盪器的誤差其實已經很小了,只不過在一切追求完美的角度來看,並不是所有的石英震盪器都很精準的。

Jitter產生的源頭要從產生系統時基的石英震盪器開始說起。石英震盪器的主要成分為石英,將石英切成薄片加上電壓,可以讓石英產生震盪的效果,將薄片切成不同的厚度,會產生不同的頻率,不同的品質也會造成石英震盪時的誤差,比如說某一石英震盪晶體的規格為40MHz ±100KHz。「40MHz」就是震盪頻率而「±100KHz」就是工作時的誤差。數位電路的運作好比整隊行進的部隊,必須要有人發號行進的口令,一是左腳二是右腳,如此整個系統才能正確無誤的運作,否則必然癱瘓。石英震盪器的目的就在於發出系統動作的口令,這份口令就是穩定的工作頻率,叫做時基,也叫做時鐘(Clock),絕大多數的數位IC都有一支接腳,作為時基的輸入,藉由時基的持續運作,這些IC才能穩定的踏步前進。

理想上而言,如果所有的零件聽從時基的指示,一步一步地接收與送出訊號,系統是不會有Jitter產生的。但每項元件都有其誤差值,不同的溫度以及不同的使用狀況,會讓這些元件趨向於不穩定的狀態。例如,CD轉盤讀取CD上的資料時,由於雷射頭對焦的失誤、由於轉動馬達的不穩定,由於外界的震動導致循軌發生跳針的現象,就會影響CD轉盤送出數位訊號的穩定性,這就是Jitter產生的千種原因之一。

轉盤依照S/PDIF格式送出數位碼,藉由數位線傳導至數類轉換器,數類轉換器內的接收晶片再依照傳送過來的數位碼,由接收晶片解出包含於其中的序列資料(及兩聲道的音樂資料)以及工作時基。請注意,數類轉換器的工作時基,是依照轉盤傳送過來的數位碼為依據,如果轉盤送過來的數位碼已經存在Jitter,數類轉換器必然也會跟著產生誤差,於是,最終聽到的聲音也就存在誤差。

Jitter的問題影響到底有多大?沒有人能證實,從另外一個角度來說,Jitter所造成的影響有如LP唱盤抗滑調整不當,或轉速不正常所導致的對音色的影響。它們不論是大是小,總都是一種失真。如果能夠降低Jitter,至少就能夠保證聲音更接近原來一些些,雖然還有其它的問題待克服。

頭痛先醫頭,降低Jitter的方法其實很簡單,既然它是轉盤不穩定所造成的訊號偏差,不如就讓數類轉換器的工作時基也與轉盤同步,如此大家聽從同一時基口令,就能降低時基誤差了。

設計者想到的改善方法很簡單,轉盤與數類轉換器之間,除了原來的S/PDIF數位線之外,另外加上一條時基線,一方面傳送數位資料,另一方面也同步傳送工作時基,如此就解決問題了。最早提出此問題的人已經很難考證,但LINN和Arcam則是最早提出因應對策的廠家之一。dpa在自家的轉盤與數類轉換器之間發明了同步線,利用四條Toslink光纖連接轉盤與數類轉換器,同時傳輸數位資料,也同步傳輸時基訊號,如此只要兩個系統同時共用一個誤差夠低的石英震盪器,就可以有效降低Jitter的問題。

S/PDIF是由Sony與Philips共同制訂的數位傳輸格式,適用使用於CD系統的資料傳輸。由於採用串列資料傳輸,因此Philips早就已經預期會有Jitter問題的產生,因此Philips另外發表了I平方S介面(正確的名稱為I2S,由於排版軟體無法印出『2平方』的字體,因此以此稱之),目的就在於提共額外的傳輸介面,降低Jitter的產生。也許就因為沒有人能證實Jitter所帶來的影響究竟有多大,有Jitter也好,Jitter=0也好,它們對於改善聲音的效果似乎有限,因此大家都把Jitter問題當作一回事,但真正實行對策的廠家卻不多。Audio Alchemy利用Philips的I平方S介面,在自家的產品上發表了I平方S連接端子;Sonic Frontiers也在自家的數位器材上,使用電腦D Type連接器,制訂了自家的I平方S連接器。這些努力消費者都看得見,但究竟規格始終沒有統一,似乎告訴著消費者:在意的廠家依舊在意,不在乎的廠家也不在乎!

日本Victor為了Jitter問題也做出了因應對策,它們提出K2介面。K2介面並非一種特殊的介面,K2介面是一種改善Jitter的作法,也是一種有效糾正Jitter問題的理論,它適用於所有使用數位傳輸的器材上。K2的作法是這樣的,在數類轉換器內安置一個誤差極低的石英震盪器,石英震盪器發出的頻率正好是標準的工作頻率。這個石英震盪器發出的頻率就當作系統的運作時基,從接收晶片接收過來的數位訊號必定存在或多或少的Jitter,沒有關係,利用數位比較線路,將接收過來存在Jitter的數位訊號與石英震盪器的時基做比較,同時做糾正時基的動作,如此一來,即使轉盤的Jitter誤差再大也不怕了,在配備有K2介面的數類轉換器中,也可以達到Jitter盡量等於零的目的。但還是那句話,Jitter問題只是導致聲音偏離原音的因素之一,Jitter=0並不代表一定就會好聽。

數位介面處理器也是改善Jitter的器材之一,目前推出的產品有Genesis的Digital Lens數位鏡,也有Audio Alchemy的DTI Pro,Sonic Frontiers更推出了Jitter Bug等產品,都是為了抑制Jitter產生而發明的武器。不過這些器材並不在本篇討論的範圍,因此就此打住。

使用DSP晶片增強馬力

DSP(Digital Signal Prossor)數位訊號處理器,是一種具有特異功能的單晶片(Single Chip),單晶片的意思簡單的說,就是具備電腦運作的基本功能,縮小體積於一體的IC,因此可以將它視為一部小型電腦,或者非常聰明的IC。

聰明的IC可以處理很多事情,與電腦一樣,IC本身只是一只具有特異功能的硬體,使用時必須注入程式,才能依照指示而動作。開發DSP必須有專精的人才,這種人才除了要熟悉軟體的撰寫以外,還必須專精於高等數學的計算,因為DSP的主要工作就在於計算。

計算些什麼呢?DSP的功能相當強大,計算的速度也快,依照DSP的不同,擅長計算的能力(或說科目吧!)也不同,大多數的DSP擅長於函數的轉換與計算,微積分上複雜的計算,也可以透過DSP內建的函數功能而輕鬆計算,DSP內部也具有浮點運算,因此對於音響上經常用到的傅立葉轉換也可以輕鬆完成。藉由DSP在計算上的特異功能,拿來做數位濾波或其他數位訊號處理,的確相當適合。

關於數位濾波的意義,前面幾篇文章已經有詳細的說明,透過DSP的運算,設計者可以自由發揮數位濾波的性能,換句話說,為自己的數類轉換器量身訂做一個數位濾波器。由於DSP是可程式化的IC,因此使用DSP的器材,可以透過更換程式的方式,達到升級的目的。當然,更換程式升級,改變的只有DSP的部份,目前有廠家宣稱可以透過更換程式而提昇DAC解析度的說法,筆者認為應該持保留的態度,除非他真的神通非常廣大。

Theta早期以製造真空管前級起家,後來介入數類轉換器的市場,因為導入DSP技術而聲名大噪。Theta使用Motorola DSP56001晶片做運算,老闆招攬數位人才為它撰寫程式,因此當大多數音響廠家還在研究數類轉換器的構造時,Theta就推出以DSP做數位濾波的數類轉換器,加上類比線路本來就是Theta專長的科目,因此Theta幾乎成為了數類轉換器的代名詞。

Theta也藉此做到真正的升級服務,從GⅡ到目前旗艦GⅤa,數位電路板上幾乎不做任何更動,只更換因應的程式。而DAC晶片設計在類比電路板上,因此只要更新整塊類比電路板,就可以達到升級的動作。

就加工水準以及技術層次來說,Wadia似乎比Theta更高明一些,除了同樣在DSP上下努力之外,Wadia對於機箱的製作格外用心,將整塊實心鋁塊直接送上CNC車床,挖出擺放電路板的空間,藉此達到高剛性以及屏蔽效果佳的機箱。

已經歇業的Vimak也為數類轉換器增添不少高科技的色彩,打開Vimak的機箱,複雜程度恐怕無人出其右,Vimak使用CS 8412做接收,然後利用DSP做數位濾波以及超取樣的工作。Vimak的超取樣相當特殊,當大家使用DSP只做到8倍超取樣的同時,Vimak宣稱達擁有128倍超取樣的動作,實際上如何運算並不清楚,但如果為真,恐怕也是使用DSP技術的一項高難度挑戰。

Sigtech不僅僅是一部數類轉換器而已,它利用DSP高速計算的功能,利用工作母機在聆聽系統上測得的各項反射數據,將數據輸入用家的機器中,Sigtech就可以依照房間以及搭配器材的特性,計算出適合聆聽的類比訊號。關於此點理論頗為複雜,有興趣的讀者請翻閱當時的專文介紹。

Accuphase最新推出的DG-28數位等化器,也可以說是一部充分發揮DSP技術的器材。傳統的等化器皆使用含有「感抗」(如電感)與「容抗」(如電容)的電子零件,藉由元件對於頻率改變特性的特質,組合出具有等化效果的器材。但傳統被動元件改變特性的同時,也會扭曲原來的訊號,比如相位飄移、失真等,但藉由數學方式的計算,以數位方式實行,既可以達到等化的效果,又可以保持相位不飄移的神奇特性,因此Accuphase DQ-28的內部,其實可以將它視為一部電腦,一部使用DSP計算的電腦音響。但聲音是類比的,如何透過數位計算達到等化的效果呢?很簡單,使用數位輸入,或者先將類比訊號轉為數位訊號,進行運算之後再轉為類比輸出即可。

既然DSP可以透過程式撰寫,如果有一位設計者,一口氣寫了六個不同的數位濾波程式,而這些程式可以透過面板上的開關直接切換,是不是就可以即時聽到不同數位濾波所帶來聲音上的改變?方法當然行得通,只不過世界上只有一家這樣做,這就是德國Audio Net的數類轉換器,名字就叫做DAC。這部數類轉換器也使用CS 8412做接收,並且使用DSP晶片做運算,它同時準備了四套不同的程式,只要從面板上切換,就可以馬上改變聲音。

調音功夫勝過一切

數位技術可高可低,有辦法撰寫DSP程式的人自然逮住機會發揮長處,不喜歡賣弄數位技術(或者根本不會)的公司也不少,數類轉換器對它們而言是否就搞不出花樣呢?其實未必,實際上,在類比部份搞花樣的廠家也不少,它們不見得要靠數位技術才能生存,在類比部份動些手腳,改變恐怕比數位還大呢!

在類比部份動手腳,唯一可以發揮的地方在DAC輸出之後,如果該DAC為電流輸出的種類,還可以透過I/V(電流對電壓)的轉換中,加入自己的設計理念。從DAC輸出之後,設計者可以從「類比濾波」以及「類比放大」兩方面著手。

類比濾波由於必須採用高階的低通濾波器,因此必須使用主動式濾波器。類比濾波的目的在於將DAC輸出的「階梯狀類比電壓」平滑化,因此平滑的效果越佳,聲音就會越接近類比的效果。Audio Research以及Krell等類比專精的廠家,在這部份就會捨棄方便的OP AMP(運算放大器),而採用大量電晶體架構出類比濾波的電路,效果何者為優?無從比較。

而類比濾波之後的類比放大,也是類比廠家得以好好發揮長處的地方。類比放大的功能,其實就只有將類比訊號做低倍放大以及緩衝而已,由於數類轉換器僅算是訊源器材,大多數的輸出電平在2V左右,因此只需要低倍、甚至於一倍的放大即可,主要的放大留給前級。當然也有不按理出牌的廠家如Theta、Altis等,將輸出電平提昇至8V或以上,讓後方的前級都強迫變成衰減器了。

類比放大就好比一部固定音量的前級,擅長真空管設計的廠家可以為它大刀闊斧建構一個完整複雜的放大電路,Audio Research、Jadis以及Altis等,在該廠的數類轉換器當中,特別騰出了很大的空間,作為真空管放大電路之用,其中最費工夫的,莫過於Sonic Frontiers的器材,從SFD時**始,就開始採用真空管做緩衝,直到最新的Processor 3為止,更將電源分離成一個機箱,內部線路有一半以上是真空管放大線路,而其採用的數位技術不過是現成的晶片罷了。但有誰否認它在聲音上的成就嗎?設計廠商可以利用一顆八支腳的雙OP達成類比放大,也可以像Sonic Frontiers一樣使用大量真空管建構,對於廠商而言,只要聲音好能賣錢,沒有什麼不可以的。

<圖1>dpa的數位器材是早期提出Jitter問題的廠家,他們使用多條光纖線連接,同時傳輸數位訊號以及同步訊號。

<圖2>Audio Alchemy依照Philips I平方S的理論,推出了S/PDIF轉I平方S的轉接器,藉此可以將S/PDIF的訊號分離出同步訊號以及數位資料,從此兵分二路個別傳送。

<圖3>Vimak DS-2000可能是最複雜的數類轉換器,內部分割成三等分,分別是電源、數位以及類比放大,它的微調功能相當多,也具有前級的功能,內部採用DSP運算,據說超取樣達到128倍!

<圖4>德國Audionet別出心裁,為DSP撰寫了六套數位濾波程式,只需透過面板的切換開關,即可改變數位濾波的形式,不必換機器就能聽到六種不同的聲音。

<圖5>對於dcs來說,沒有什麼辦不到的事,在24Bit DAC推出之前,dcs Elgar就已經利用電路的技巧,達到24Bit/96KHz的能力,現在它們又推出了更新的24Bit/192KHz轉換器,走在規格的先端。

<圖6>Accuphase DQ-28是第一部採用數位方式的等化器,打開內部一看,電路板上並沒有用來控制頻率響應的RC元件,而是高速運算的數位晶片。

<圖7>擅長類比設計的廠家,絕對不會放過一展身手的機會,Sonic Frontiers Processor 3使用Ultra Analog的接收與轉換模組,在類比部份則加入了真空管緩衝線路,以類比調聲的方式達到目的。
一步接一步

談DAC的工作架構 編輯部

一部數類轉換器並不是單純的僅由DAC晶片所構成,實際上為了達成數位訊號轉成類比訊號的目的,必須有一連串的準備、整理與轉換過程。在數位訊號送到DAC晶片之前的電路,我們可以將它視為「為轉換做準備」;而DAC晶片之後的電路,則可以視為「為類比輸出做調整」。
數位接收端子

數類轉換器內位於先鋒部隊的,是數位接收介面,也就是連接數位線的端子。最簡單的是同軸以及AES/EBU所制訂的平衡端子。其中同軸又分成兩種,其一是RCA端子,另一種則是部份廠商大力提倡的BNC端子。其次,是為光纖介面,常用的光纖介面也有兩種,其一是塑膠光纖Toslink,它的接頭採用塑膠製成,接口為有方向性的方形,長度多為一米左右,雖然光纖具有傳輸長距離的本事與功能,但在音響上似乎僅把光纖當成一種單純的傳輸介面而已。另一種光纖為AT&T玻璃光纖,使用這種光纖介面的廠家並不多,主要原因是玻璃光纖比較貴、不能折,而且玻璃光纖線沒有太多種選擇。

接收介面並不複雜,它只是傳輸數位訊號的橋樑而已,但設計者仍然可以藉此發揮創意,例如利用TTL IC(電晶體電晶體邏輯積體電路,一種廣泛使用的數位邏輯IC),組成的波形整型電路。早期市面上就有業者出售此類小型電路板,讓消費者自行加裝在CD轉盤的輸出端子上,將輸出的數位波形進行整型的動作,藉此提昇數位波形的準確率。

脈衝變壓器

最近幾年在數位接收介面上又有了新點子,可能是Crystal的建議使然,在Crystal原廠的資料手冊上,建議同軸或AES/EBU平衡端子的數位線輸入,可以使用「脈衝變壓器」作為輸入的隔離緩衝。脈衝變壓器是一種體型極小的變壓器,它工作於高頻,適合數位傳輸,就像真空管擴大機裡使用的交連變壓器一般,作為數位線與接收晶片之間的交連介面。

使用緩衝變壓器的好處很多,它可以有效隔絕直流、可以有效阻絕雜訊,數位訊號是相當敏感的,尤其當線材廠商喜歡在線材上動手腳時,對於數位波形無疑是一種嚴重的傷害(對於『調聲』的目的而言,動動線材的手腳改變波形,確實可以達到調聲的目的,但對於『傳輸』的目的而言,一般廉價的75歐姆同軸線,性能可能比一條數萬元的數位線更優異)。緩衝變壓器的價格相當便宜,它是數位電路中經常使用的元件,在數位電路上可稱為小兵立大功。

從另外一個角度來看,使用同軸線時,由於使用中心導體傳導訊號,而包圍在中心導體外的隔離層,則同時扮演地線與隔離的雙重功能,對於傳輸訊號而言,是相當簡潔且有效的方法,因為中心導體被隔離層徹底包圍,外界的電波根本無從進入干擾。但從電力傳輸的角度來看,中心導體與隔離層的特性不同,也會形成正負端特性不一的情況,因此使用脈衝變壓器也可以達到傳輸平衡的效果,並可以避免與系統的地線相互干擾(請注意,數位線的地與訊號線的地往往是不相通的,它們的地線是個別處理的)。

數位資料由轉盤送出,經過數位線連接至數類轉換器的插頭,也就是剛剛我們提到的種種連接介面,然後再經過脈衝變壓器的交連,將不要的雜訊隔離在外,只讓數位訊號進入數類轉換器之內。若廠商在此沒有別的花招,則直接送入「接收晶片」。

接收晶片

接收晶片的種類相當多,由於在CD系統上使用SONY與Philips聯合制訂的S/PDIF數位傳輸格式,因此必須採用能夠解讀這種格式的接收晶片,才能將數位訊號進行解碼的動作。對於接收晶片而言,Crystal無疑是大贏家,它們發展的CS 841X系列特別針對音響用途而設計,價格低廉效果優異,可以輸出12種格式,適應絕大多數的DAC晶片。而設計與使用更是方便,因此在數類轉換器上最常見到的接收晶片,莫過於Crystal CS 8412接收晶片。

接收晶片接收數位資料之後,會分離出三個數位訊號,這三筆資料正是將數位訊號「還原」成類比訊號的最重要指令。接收晶片接收來自轉盤的數位訊號,並且從訊號中分離出三筆數位訊號(或稱資料),它的功能很簡單,構造也不複雜,但晶片內必須擁有抑制Jitter的PLL線路。這顆全世界使用率最廣的接收晶片,據說由台積電所生產,而CS8412也有版本之分,1992年以前的為A、B以及C版,1992年之後,Crystal公司為CS 8412內部線路進行修改,加強抑制Jitter的能力,之後則全為G版。Crystal因應24bit/96KHz的趨勢,必須推出因應的接收晶片,以便接收24bit/96KHz的數位訊號,目前推出相對應的接收晶片為CS 8414,採用SMT接腳設計,功能加強體型卻大幅度縮小。更令人佩服的是,它的腳位完全與舊款CS 8412完全相容,如果您目前使用CS 8412接收晶片,現在也可以換成更新的CS 8414而無需修改任何線路。當然,要先為它找到轉接插座才行。

接收晶片分離出的三筆訊號可以直接進入DAC晶片了嗎?理論上可以,只要再使用簡單的數位邏輯IC,依照這三筆數位訊號的指示,依序將數位資料「灌入」DAC晶片中,就可以獲得類比輸出。不過為求更好的效果,在進入DAC晶片之前仍然要進行整理的動作。

數位濾波

「數位濾波」與「超取樣」是大家既熟悉卻又陌生的名詞,由於理論與實際皆牽捨到深入的數位技術,因此只要瞭解它在數類轉換器裡所扮演的角色以及工作原理即可。接收晶片是一顆IC,它僅負責接收數位訊號,並且分離出暗藏於數位資料中的時脈訊號。數位濾波是一種處理數位訊號的技術,同樣也必須使用IC來進行處理。古早當IC設計還處於分工的時代,每一個動作都必須使用相對應的晶片進行處理,最廣被使用的數位濾波晶片包括Yamaha、NPC以及SONY的晶片。

理想上,數類轉換器是不需要進行數位濾波的,當接收晶片把控制訊號分離出來之後,再把聲音資料送入DAC晶片進行轉換,DAC晶片會將數位資料解成「鋸齒狀」的「近似類比訊號」,晶片設計家認為,只要利用傳統的類比低通濾波器接在DAC晶片之後,把20KHz以上的訊號濾除掉,就可以獲得0-20KHz完整的類比聲音。但實際上卻無法如願,最主要原因在於傳統的類比濾波器具有先天上的問題。類比濾波器使用RC(R是電阻,C是電容)元件組成,當R與C組合在一起的時候,會產生濾波器的效果,使用在DAC數類轉換器上的類比濾波器必須採用高階數、高斜率的濾波器,雖然達到了將20KHz以上訊號濾除的效果,卻也造成了相位嚴重偏移的問題。

數位濾波的功能是:採用數學計算的方式,利用數位濾波IC或DSP晶片,以撰寫的程式驅動IC處理數位訊號,使達成低通濾波器的效果。由於採用數學計算的方式,因此可以在完全沒有相位飄移的情況下,達到高階數濾波的效果。藉由數位濾波的先前處理,將可以減輕類比濾波器的工作負擔,減輕相位飄移的問題。

常見的數位濾波有四種,第一種是最簡單的方法,採用內建數位濾波的DAC晶片,將接收晶片解讀出來的訊號直接灌入DAC晶片中,這顆多功能的DAC晶片就會自動處理數位濾波的程序;第二種是採用現成晶片,某些DAC晶片沒有內建數位濾波的功能,設計者必須在電路中加入數位濾波器,這類的數位濾波器剛剛已經提到,Yamaha、NPC以及Sony、Philips是其中的大宗;第三種也是採用現成晶片,不過這顆晶片比較特殊,它既是數位濾波晶片,同時也是HDCD解碼器,這就是常見的PMD-100。擁有HDCD解碼功能的數類轉換器,內部都使用這一顆PMD-100作為數位濾波與解碼之用;第四種最複雜也最具創意,廠商可以利用DSP高速運算的功能,自行撰寫數位濾波程式,以達到數位濾波的功能。

超取樣與插補原理

數位濾波之後是不是可以進入DAC了?理論上可以,實際上也沒問題,只不過如果配合「超取樣」之後,效果會更好一些。超取樣的技術除了運用在DAC上外,ADC也具有超取樣技術,它們的原理是相同的。

就DAC的目的來說,超取樣的功能有二:最主要的功能是將DAC輸出的雜訊頻段拉往更高的頻率帶,如此就可以將DAC轉換之後的「量化雜訊」遠離20KHz,在DAC之後的濾比濾波器就不必採用高階數的設計,不但可以降低類比濾波器的負擔,同時也可以簡化類比濾波器的設計,降低失真與相位飄移。超取樣另一個功能是進行插補的動作,讓輸入DAC的數位訊號更連續、更平滑。

很多人誤解超取樣的意義,超取樣有2倍、4倍、8倍…取樣等,超取樣的倍數一定是2的整數倍,於是乎有人說,兩倍超取樣就是CD轉盤連讀兩次訊號,藉此降低錯誤率,其實這是完全錯誤的。

超取樣的原理是一種提升「取樣頻率」的技術,CD設定的取樣頻率為44.1KHz,當使用2倍超取樣時,取樣頻率提升為88.2KHz,問題來了,從CD上讀取的取樣頻率僅有44.1KHz,如何增加取樣頻率呢?這增加的取樣頻率的資料要從哪裡生出來?答案很簡單,「插補」的功能就在這裡。

插補動作也是一種計算過程,依照CD上前後連續幾筆的資料,藉此為參考推算出聲音應該行進的曲線。插補計算就像是一把繪製工程圖的「曲線板」,參考前後幾點的位置,推算出點與點之間的曲線。2倍超取樣意即在點與點之間(兩個44.1KHz的點)要插入一筆計算值;4倍超取樣意即在點與點之間要插入三筆計算值;依此類推8倍超取樣、16倍超取樣…128倍超取樣等,取樣頻率越高,就代表點與點之間的插補資料越密集,理論上可以獲得更連貫的聲音變化。這方面請參考灰框說明。

D/A轉換

前面說了一大篇,一直到這裡才出現DAC晶片,所以說啦,數類轉換器並不是單靠DAC晶片所組成,它必須依照許多週邊元件一起聯合動作而成。DAC晶片種類相當多,後面的文章有簡單的解說,在此不多解釋。CD格式為16bit,基本上必須選用16bit或16bit以上的DAC晶片進行轉換。不同設計形式的DAC音色各有不同,位元流的晶片偏重滑順的流暢感,而傳統多位元晶片則以動態取勝,當然,規格完全相同的DAC晶片必然存在不同的聲音特色,一位設計師設計數類轉換器時該採用何種DAC晶片,除了價格的考量之外,就是對聲音的品味了。

DAC的主要功能就是將數位資料轉換成相對應的類比訊號,但轉換出來的類比訊號是相當生硬的、是不連貫的、是鋸齒狀的,因此必須利用連接於DAC晶片之後的類比濾波進行平滑化的處理,聲音才能平順入耳。

類比濾波器

從前面的敘述中,看倌們或多或少可以了解類比濾波器所扮演的角色,它屬於高階性(也就是說斜率很高)的低通濾波器,能夠有效將20KHz以上的訊號濾除,僅讓20KHz以下的聲音訊號通過,鋸齒狀的類比波型通過類比濾波器之後,就變成了平滑的聲音曲線,因此類比濾波器的設計大大影響著聲音的品質。

類比濾波器通常以主動元件配合RC元件構成,主動元件的採用也得看設計師的意思,要簡潔設計的,採用OP最方便,要秀秀實力的,也可以使用大量電晶體構成類比濾波的線路。

由於之前超取樣與插補的處理,使得DAC轉換之後的鋸齒狀波型較細微,能夠盡量達到平滑化的要求,因此所有運用在數類轉換器上的技術都是相輔相成的。

類比放大

這一部份在數類轉換器中可有可無,類比濾波之後大約可以獲得2V RMS(有效值)左右的類比輸出,此輸出可以直接連接前級進行下一級的放大。有些設計師會希望他設計的數類轉換器具有某些聲音上的特質,比如說Krell會用大量電晶體調聲,使其具有電晶體的聲音特色;Sonic Frontiers獨愛真空管,即使是數位器材也硬要把真空管塞進去;Wadia特別標榜數位科技,IC是他家的最愛,因此類比放大的部份則採用OP構成。

從轉盤傳送過來的數位訊號,經過了重重的處理關卡,至此已經還原成平滑的類比訊號了,準備一條訊號線,將類比訊號連接至前級吧!

超取樣與插補是相輔相成的,超取樣的原先目的在於將DAC輸出的雜訊範圍往更高的頻率拉,藉此降低類比濾波的負擔,而超取樣的過程中利用插補技術,可以獲得更高的聲音資訊,插補的動作如圖所示。

digital

<圖1>高級的數類轉換器往往具有各式各樣的連接端子,RCA同軸、BNC同軸、ST玻璃光纖、Toslink塑膠光纖等。

126
<圖2>在設計良好的數類轉換器內,經常可以見到體積小巧的脈衝變壓器(圖中兩個看起來像線圈的東西),它具有隔絕雜訊的功效。

127

<圖3>HDCD解碼晶片為PMD-100,凡具有HDCD解碼功能的解碼器,內部皆具有這一顆晶片,它與週邊零件共同結合成一部數類轉換器。

CUE Splitting

Installation

To split the audio files you’ll need to install shntool:

 pacman -S shntool

If you want to split iso/bin files, you will also need bchunk:

 pacman -S bchunk

You’ll need to install decoders to read the files, for example:

 pacman -S mac flac wavpack

To encode files to any format other than wav you’ll need to install encoders, for example:

 pacman -S flac lame vorbis-tools

To tag the files you’ll need extra tools such as:

 pacman -S cuetools mp3info vorbis-tools

Splitting

To split a disc audio file accompanied by a cue sheet use the shnsplit command, for example:

 shnsplit -f file.cue file.ape

 shnsplit -f file.cue file.wv

To split bin files with cue sheets use

 bchunk -v -w file.bin file.cue out

All these commands produce .wav files. You probably want to compress the audio files with formats like flac or mp3.

shnsplits gives the possibility to convert on the fly to most lossless formats, like flac. It can be used like so:

 shnsplit -f file.cue -o flac file.ape

If you need more control over the conversion you may change the converter parameters inline:

 shnsplit -f file.cue -o "flac flac -s -8 -o %f -" file.ape

The formats shnsplit supports can be view using the command

 shntool -a

For other situations, like wanting to convert to lossy formats like vorbis or mp3 and when using bchunk, refer to Convert Any To Mp3 for examples.

Tagging

You’ll need cuetools to use cuetag.sh.

To copy the metadata from a cue sheet to the splitted files you can use:

 cuetag.sh file.cue *.mp3

or if you need to select only certain files:

 cuetag.sh file.cue track01.mp3 track02.mp3 track03.mp3 track04.mp3

cuetag.sh supports id3 tags for .mp3 files and vorbis tags for .ogg and .flac files.

Alternatives

fostex A8 usb播放的问题

刚发现fostex A8的usb在linux下用mplayer播放没有声音,但aplay是有声音的。查看了一下aplay时声卡的硬件状态(播放时):

cat /proc/asound/card1/pcm0p/sub0/hw_params

access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1298
buffer_size: 22050

发现输出PCM被提升至32位,而且aplay播放是无论原始文件的格式,一律强制提升。而mplayer则不会。另一方面fostex A8的usb只接受32位的PCM所以mplayer播放会没有声音。

追加-format s32le参数会另mplayer也强制输出32位PCM,问题解决。

另外一个注意的问题是当使用libalsa库的播放器输出,默认会强制转换到48K的采样率,修改/usr/share/alsa/alsa.conf中的defaults.pcm.dmix.rate 44100解决。如果实在是想用自动升频可以用更好的算法:安装alsa-plugins-samplerate包,然后修改/usr/share/alsa/alsa.conf中的defaults.pcm.rate_converter “samplerate_best”。