首頁(yè) > 評(píng)測(cè) > (番外)情懷篇之一 PC音頻硬件簡(jiǎn)介

(番外)情懷篇之一 PC音頻硬件簡(jiǎn)介

聲卡   音頻硬件   PC   DSP   
  • 作者:zhanzr21
  • 來(lái)源:21ic
  • [導(dǎo)讀]
  • Intel MSC-51也能做PC聲卡?!

21ic打算攜手資(tu)深(ding)直男癌晚期工程師zhanzr21,來(lái)給大家講一講嵌入式系統(tǒng)與音頻處理的故事。

關(guān)于zhanzr21

曾經(jīng)混跡于兩岸三地,摸爬滾打在前端后端,搞過(guò)學(xué)術(shù)上過(guò)班,F(xiàn)在創(chuàng)業(yè)中,歡迎各種撩

點(diǎn)擊鏈接加入群【嵌入式音頻信號(hào)處理】:https://jq.qq.com/?_wv=1027&k=45wk8Ks

嵌入式音頻專用資料代碼分享:https://pan.baidu.com/s/1dFh5pWd

apple2_speaker2_copy.jpg

在IBM PC流行之前的時(shí)代,一般的個(gè)人電腦都沒(méi)有聲卡.某些主機(jī),比如NES,Atari之類的注重于游戲應(yīng)用的,都有專門(mén)設(shè)計(jì)的聲音設(shè)備.比如NES主機(jī)在CPU(定制的6502)中專門(mén)設(shè)計(jì)了一個(gè)APU的外設(shè)來(lái)播放聲音.說(shuō)起來(lái)這個(gè)APU還是5通道呢:兩路方波,一路三角波,一路噪音,一路采樣. 注意這個(gè)5通道不是現(xiàn)在說(shuō)的5聲道這種概念,而是5通道信號(hào)進(jìn)行疊加實(shí)現(xiàn)類聲卡的功能.關(guān)于NES的音頻硬件軟件的內(nèi)容將在今后的連載中介紹,這里還是回到PC音頻硬件上來(lái).

說(shuō)聲卡之前先講一講PC揚(yáng)聲器(實(shí)際上現(xiàn)代嵌入式系統(tǒng)中這個(gè)稱作蜂鳴器更合適,但是所有文獻(xiàn)都稱作Speaker,這里也隨俗.有這個(gè)設(shè)備的主板有焊接蜂鳴器的,也有焊接揚(yáng)聲器的,只是起的作用跟嵌入式系統(tǒng)中的無(wú)源蜂鳴器類似.).作為音頻設(shè)備,揚(yáng)聲器早于真正意義上的聲卡出現(xiàn)在PC上.因此聲卡與揚(yáng)聲器是分開(kāi)的兩個(gè)設(shè)備,揚(yáng)聲器是直接焊接在主板南橋的定時(shí)器(8253/8254兼容定時(shí)器)引腳上面. 有一定年齡的讀者可能還記得那種老電腦出了故障的時(shí)候,滴滴滴滴的報(bào)警聲. 有經(jīng)驗(yàn)的老司機(jī)們還可以通過(guò)揚(yáng)聲器不同響聲模式來(lái)判斷電腦故障的原因.比如: 短短短-內(nèi)存沒(méi)有插好, 短長(zhǎng)短-硬盤(pán)沒(méi)有插好, 長(zhǎng)-風(fēng)扇散熱不夠等等.

[因?yàn)檫@個(gè)揚(yáng)聲器只能輸出高和低的方波,本質(zhì)上就不是用來(lái)播放PCM的.但是本系列文章介紹過(guò)一種D類放大器,可以通過(guò)PWM+濾波器實(shí)現(xiàn)一種簡(jiǎn)單DAC. 事實(shí)上確實(shí)有人做過(guò)這樣的實(shí)驗(yàn). 只是考慮到現(xiàn)代電腦上揚(yáng)聲器已經(jīng)與聲卡合并了, 本文就不進(jìn)行這個(gè)方向的闡敘了.]

時(shí)過(guò)境遷, 大多數(shù)電腦上早就沒(méi)有專門(mén)的揚(yáng)聲器了. 現(xiàn)在的操作系統(tǒng)中一般把揚(yáng)聲器的調(diào)用轉(zhuǎn)到聲卡上執(zhí)行, 當(dāng)然用戶可以設(shè)置是否使能這種轉(zhuǎn)向.

揚(yáng)聲器的聲音轉(zhuǎn)移到聲卡上播放.jpg

圖 揚(yáng)聲器的聲音轉(zhuǎn)移到聲卡上播放

Windows操作系統(tǒng)API中還遺留著這個(gè)揚(yáng)聲器的控制接口. WinXP與Vista中曾經(jīng)去除這個(gè)API,但是Win7又恢復(fù)了. 這個(gè)調(diào)用的函數(shù)就是:

BOOL WINAPI Beep(

_In_ DWORD dwFreq,

_In_ DWORD dwDuration

);

我想, 這個(gè)函數(shù)的命名也是沒(méi)有出乎任何人的意料吧.

第一個(gè)參數(shù)為頻率,范圍為:37Hz到32767Hz. 那么這個(gè)范圍怎么來(lái)的呢.先說(shuō)37Hz,這是由于早期PC運(yùn)行的主頻而來(lái)的. 當(dāng)年所有的PC兼容機(jī)給板子上的定時(shí)器8254提供的頻率為: 1.19318 MHz(14.31818 MHz除以12). 這個(gè)頻率除以65536(8254為16位定時(shí)器, 65536是最大的分頻系數(shù))得到18.2Hz的最小分辨率, 而方波是50%占空比, 需要兩次翻轉(zhuǎn)輸出口,所以驅(qū)動(dòng)揚(yáng)聲器最低頻率為36.4Hz, 取整得37Hz. 其實(shí)如果真正做到bug級(jí)別兼容的PC主機(jī), 所謂的37Hz揚(yáng)聲器聲音就是36.4Hz. 只是后來(lái)主板上增加了更精準(zhǔn)的定時(shí)器, 37Hz也能精確的實(shí)現(xiàn). 那么32767怎么來(lái)的, 這個(gè)簡(jiǎn)單一些, 因?yàn)樵缙诘牟僮飨到y(tǒng)大多是16位的, 16位有符號(hào)整數(shù)的最大值是32767. 因?yàn)槿硕念l率響應(yīng)范圍是20Hz-20KHz,這兩個(gè)極限也不怎么影響這個(gè)API的目的.下面做個(gè)實(shí)驗(yàn),聽(tīng)一聽(tīng)實(shí)際的揚(yáng)聲器的嘀嘀聲.

#!/bin/python

#Example source code for 21ic

#Default runs in Python 3.5 Environment

#Author: zhanzr21

#Description: This Example plays different beep using the windows API(Beep). So it will only run on Windows(After Version 7) Machine

#

import winsound

import time

for freq in range(37,32767, 100):

winsound.Beep(freq, 500)

time.sleep(0.5)

根據(jù)作者的實(shí)踐,100Hz以下的聲音很難感覺(jué)到, 15KHz之后也幾乎聽(tīng)不到, 反倒是25KHz之后到32KHz慢慢的有點(diǎn)聽(tīng)得見(jiàn). 這并非作者有特異功能, 而是屬于一般的音頻硬件的濾波器的副作用, 25KHz到32KHz這個(gè)范圍的音頻在通過(guò)濾波器時(shí)產(chǎn)生了一些低頻的剩余能量.

事實(shí)上除了Beep這個(gè)函數(shù),還有一個(gè)Windows API也是產(chǎn)生簡(jiǎn)單聲音. 只是這個(gè)函數(shù)優(yōu)先通過(guò)聲卡來(lái)播放, 如果沒(méi)有聲卡就播放給揚(yáng)聲器. 這個(gè)調(diào)用叫做:

BOOL WINAPI MessageBeep(

_In_ UINT uType

);

相比于上面說(shuō)的Beep函數(shù), 這個(gè)函數(shù)僅能播放系統(tǒng)默認(rèn)的幾種聲音.下面是實(shí)驗(yàn)代碼:

#!/bin/python

#Example source code for 21ic

#Default runs in Python 3.5 Environment

#Author: zhanzr21

#Description: This Example plays different beeps using the windows API(MessageBeep). So it will only run on Windows(After Version 7) Machine

#

import winsound

import time

winsound.MessageBeep(winsound.MB_OK)

time.sleep(0.4)

winsound.MessageBeep(winsound.MB_ICONASTERISK)

time.sleep(0.4)

winsound.MessageBeep(winsound.MB_ICONEXCLAMATION)

time.sleep(0.4)

winsound.MessageBeep(winsound.MB_ICONHAND)

time.sleep(0.4)

winsound.MessageBeep(winsound.MB_ICONQUESTION)

time.sleep(0.4)

winsound.MessageBeep(-1)

time.sleep(0.4)

說(shuō)完了揚(yáng)聲器就輪到該說(shuō)真正的聲卡了.真正的聲卡出現(xiàn)之前還有幾個(gè)過(guò)渡產(chǎn)品.比如這個(gè)使用PC的并口連一個(gè)8位的DAC, 效果比起揚(yáng)聲器來(lái)是很大的進(jìn)步了.

dss_dac-2_copy.jpg

圖 并口接DAC的Speech Thing

硬件上到了總線時(shí)代, 才陸續(xù)有聲卡這一類的擴(kuò)展音頻硬件(不需CPU來(lái)做實(shí)際的音頻控制)出現(xiàn).

early_pc_soundcard.jpg

圖 Adlib出產(chǎn)的早期類聲卡(AdLib公司是早期類聲卡的先驅(qū)者)

注意到那個(gè)藍(lán)色的器件嗎,那是個(gè)電位器, 用來(lái)調(diào)整音量的. 早期音頻硬件不是標(biāo)配的時(shí)候,操作系統(tǒng)是沒(méi)有調(diào)整音量的軟件接口的, 要調(diào)整音量請(qǐng)把手伸到機(jī)箱后面找旋鈕.

從技術(shù)的角度來(lái)看其實(shí)這個(gè)也不能算聲卡,只能算類聲卡, 因?yàn)檩敵龅穆曇暨是多通道的方波之類信號(hào)合成的. 這種卡有很多種, 復(fù)雜度也有很大的差別. 技術(shù)角度來(lái)講, 更類似今天所說(shuō)的MIDI合成器. 集成了很多效果(鼓聲,鋼琴,手風(fēng)琴等樂(lè)器).

真正和現(xiàn)代計(jì)算機(jī)的聲卡相提并論的產(chǎn)品為Creative公司的Sound Blaster系列. 在這個(gè)系列的1.0版本上使用了一個(gè)DSP(其實(shí)是個(gè)單片機(jī)), 可以播放22.05KHz, 8bit單聲道的PCM, 采樣方面支持單聲道的13bit(與后面要講的A-law格式兼容).

sb15-3.jpg

圖 早期聲卡Sound Blaster 1.5

下圖是該公司向客戶送測(cè)的一個(gè)樣品.

killer_card-3_copy.jpg

圖 Sound Blaster的樣品版本(據(jù)知情人介紹, 上面那個(gè)遮住的DIP40片子正是Intel MCS-8051)

從SoundBlaster 16系列開(kāi)始, 聲卡開(kāi)始跟我們今天使用的聲卡差別只是在參數(shù), 標(biāo)準(zhǔn)與集成度上了.

KL_Creative_Labs_Soundblaster_16_CT2230_copy.jpg

圖 SoundBlaster 16 現(xiàn)代聲卡的始祖鳥(niǎo)

 

現(xiàn)代電腦上的聲卡一般就集成到主板上, 除非有專業(yè)工作室級(jí)別的需求. 關(guān)于聲卡的話題,后面的章節(jié)如果有篇幅的話還會(huì)講到. 包括如何利用聲卡制作信號(hào)發(fā)生器, 示波器等等主題.

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評(píng)論

  • 聯(lián)系人:巧克力娃娃
  • 郵箱:board@21ic.com
  • 我要投稿
  • 歡迎入駐,開(kāi)放投稿

熱門(mén)標(biāo)簽
項(xiàng)目外包 more+