這是最近做的一個(gè)很有意思的案子,是一個(gè)玩具上用的藍(lán)牙控制器。
條件限定為:一個(gè)MONO的藍(lán)牙音頻模塊,把它做成藍(lán)牙遙控器,而且,控制的時(shí)候還要播放主機(jī)走藍(lán)牙過(guò)來(lái)的聲音。
同時(shí),這個(gè)藍(lán)牙模塊沒(méi)有數(shù)據(jù)片可以走,直接輸出載著直流的音頻差分信號(hào)。
討論的結(jié)果就是,在要播放的聲音里混音進(jìn)人耳聽(tīng)不到的頻率部分,然后在藍(lán)牙音頻模塊輸出端把數(shù)據(jù)解調(diào)出來(lái)。
解調(diào)部分
核心部分就是LM567的解調(diào)端,中心頻率設(shè)定在人耳基本聽(tīng)不到的18.5Khz
核心的部分是音調(diào)檢測(cè),用了一款NS家很老的專門做音調(diào)檢測(cè)的LM567。
其原理就是利用本地RC震蕩產(chǎn)生一個(gè)頻率,與輸入頻率進(jìn)行鑒頻,8腳是專門做鑒頻輸出用。
f0的公式電容用uF,電阻用KOmh,頻率為kHz
算出來(lái)18.5Khz下
Cx=6.8nF
Rx=7.5K
但實(shí)際調(diào)試的時(shí)候RX建議用10K的微調(diào)電阻,因?yàn)槠渌骷赡軙?huì)有誤差
帶寬跟C2和輸入信號(hào)的有效值有關(guān)。
Vi是直接取藍(lán)牙輸出的還沒(méi)過(guò)功放的小信號(hào),振幅很小,所以實(shí)際上電路的帶寬會(huì)很小,這是有利于做頻率辨識(shí)的,以防諧波以及聲音文件里夾雜的各種頻率信號(hào)的干擾。
這里C2用的0.1uF,C3用的10uF。測(cè)量出來(lái)帶寬在500~1kHz左右。
電源用5V,跟后端解碼的單片機(jī)電壓一致。
有18.5Khz輸入的時(shí)候,8腳輸出低電平。
焊好的板子如下~
聲音部分
首先用一個(gè)叫做SweepGen的軟件來(lái)做音頻發(fā)生,用Total Recorder的虛擬聲卡映射把生成的聲音捕捉下來(lái)。
注意SweepGen和Total Recoder默認(rèn)的電平和音量不是0db,記得調(diào)節(jié)到0db的原始聲音狀態(tài)。
在SweepGen里面記得把波形設(shè)置成正弦,因?yàn)?8.5Khz的方波的諧波能聽(tīng)出來(lái)。
編輯聲音妥妥的就得靠Adobe Audition了,cool edit是它的前身。其實(shí)聲音生產(chǎn)也可以用它,只是我沒(méi)找到在哪生成正弦波形。
在Audition里面可以看到,剪輯的聲音頻譜落點(diǎn)很明顯。
解調(diào)部分
因?yàn)椴シ牌髟诓シ诺臅r(shí)候可能會(huì)淡出淡入,以及藍(lán)牙模塊剛開(kāi)始播放的時(shí)候會(huì)開(kāi)啟內(nèi)部codec所以正式的編碼數(shù)據(jù)前要加一段靜音。
經(jīng)過(guò)測(cè)試,18.5Khz的信號(hào)要維持50ms以上,LM567的輸出低電平才跟著18.5Khz的持續(xù)時(shí)間接近,所以一幀數(shù)據(jù)長(zhǎng)度暫時(shí)設(shè)置為50ms。
由于無(wú)輸入的時(shí)候解調(diào)部分輸出為高,所以同步頭用一個(gè)低電平來(lái)做下降沿觸發(fā),在觸發(fā)MCU這邊的中斷后對(duì)IO進(jìn)行采樣,1ms采樣一次,50ms為一個(gè)幀,算上采樣內(nèi)執(zhí)行延時(shí),一幀共采樣32次,超過(guò)16次為低就認(rèn)為是0。
MCU用的是8051核的新塘N79E8132,2塊錢一顆的單片機(jī)
采樣的代碼段:
for (cntbit=0;cntbit<8;cntbit++)
{
sample=0;
for(samcnt=0;samcnt<32;samcnt++)
{
sample=sample+(P0&0X1); //
Delay1ms(1); //read process
}//
//printf("sample%d = %d \n",cntbit,sample);
if(sample <16) //HIGH/LOW LEVEL SET
{
state_t=state_t | (0x1<<cntbit);
}
}
這里的delay是新塘的bsp包里用定時(shí)器標(biāo)志位來(lái)做的,并且用一個(gè)IO反轉(zhuǎn)測(cè)過(guò)執(zhí)行延時(shí)才得出32次循環(huán)50ms的結(jié)果。
RC的頻率是22M。
同步頭設(shè)定為0101,后面四位作為命令位
比如01011110的波形就是下圖
頭尾1秒靜音用來(lái)避免播放器的截頭截尾效應(yīng)導(dǎo)致數(shù)據(jù)不全。
下圖是用示波器測(cè)藍(lán)牙的音頻輸出和解調(diào)器的輸出
黃色的CH1是解調(diào)器輸出,藍(lán)色的CH2是音頻輸入
下圖是另外一組01011101的波形
基本出來(lái)這個(gè)波形,解調(diào)就不是問(wèn)題了。
延時(shí)問(wèn)題
如果你真的需要用LM567,以下這個(gè)問(wèn)題你必須要考慮
咱們看圖
LM567的鑒頻腳 PIN8的鎖定延時(shí)以及失鎖以后恢復(fù)高電平的延時(shí)如圖
鎖定延時(shí)大概5ms
失鎖的延時(shí)大概是10ms
而且鎖定延時(shí)和失鎖延時(shí)會(huì)浮動(dòng),不是每一次都一樣。觀察下來(lái)的結(jié)果,這個(gè)浮動(dòng)多的時(shí)候會(huì)到上面數(shù)據(jù)的50%之多。
也就是表明,你的最小幀長(zhǎng)度必須大于15ms的2倍+幀持續(xù)長(zhǎng)度
這也是為什么一幀數(shù)據(jù)要50ms之長(zhǎng),并且要在一幀的采樣周期里采樣這么多次,還得用閾值來(lái)判別采樣期間的電平的原因。