首先,微處理器被編程為80MHz Olimex PIC32,焊接到PIC32-PINGUINO-OTG開發(fā)板。(對于那些曾經(jīng)使用Arduino板進(jìn)行修改的人:它是相同的,只有更快的芯片和更少的內(nèi)置庫)算法必須以固定的時間間隔對輸入信號進(jìn)行采樣,將此信號轉(zhuǎn)換為頻域,并可視化檢測到的頻率在16x16x5 LED矩陣上。
當(dāng)然,在編寫任何代碼之前,我們必須弄清楚如何將輸入樣本轉(zhuǎn)換為頻率分布。通過對輸入信號應(yīng)用離散傅里葉變換(DFT),在信號處理中始終完成這一事情。給定以恒定頻率采樣的信號,DFT輸出一組落在信號中的幅度或頻帶。例如,當(dāng)您的信號主要由中間C(或Do)音調(diào)組成時,DFT將為頻帶分配相對較高的幅度并匹配相應(yīng)的262 Hz頻率。
然而,人耳以對數(shù)方式感知聲音,這意味著聲音信號的頻率加倍僅被視為線性更高的音調(diào)。為了彌補(bǔ)這一點(diǎn),我們使用了Constant Q變換(CQT)代替DFT。簡而言之,在DFT返回頻帶f-2f-3f-4f-等的幅度的情況下,CQT與頻帶f-2f-4f-8f-etc一起工作。
因此,從理論角度來看,3DSA所需的算法非常簡單:以規(guī)則的時間間隔對輸入信號進(jìn)行采樣,對16個頻帶應(yīng)用CQT計(jì)算幅度,并使16個LED列中的每一個適當(dāng)?shù)亻W爍。鑒于Pinguino開發(fā)板支持C,我們假設(shè)實(shí)現(xiàn)這個算法不會那么難。但是,總會出現(xiàn)一些挑戰(zhàn):
第一個障礙:如果您只有一個線程,您如何定期采樣信號?一個簡單的解決方案是獲取樣本,計(jì)算CQT和可視化,讓線程休眠直到某個時間段已經(jīng)過去,然后再開始新的樣本 - 計(jì)算 - 可視化循環(huán)。但是,我們希望我們的采樣率為14 KHz,這在80 MHz微處理器上留下了課程,而不是樣本之間的6k個時鐘周期來計(jì)算CQT。這證明是不夠的 - 最后我們?yōu)槊總€計(jì)算 - 可視化周期使用了~1M個時鐘周期,因此我們必須弄清楚如何在進(jìn)行CQT計(jì)算和舊樣本的LED可視化時采集新樣本。
在仔細(xì)閱讀了許多Pinguino論壇之后,解決方案以中斷的形式出現(xiàn):一段比其他代碼具有更高優(yōu)先級的代碼,并由處理器以指定的時間間隔執(zhí)行。由于Pinguino開發(fā)人員沒有為PIC32上的中斷提供C庫,因此我們必須通過將某些處理器位設(shè)置為正確值來手動實(shí)現(xiàn)此功能。成長為Java程序員后,我?guī)缀蹩梢愿惺艿酱a中的硅片
另一個大障礙是PIC32芯片不存在的浮點(diǎn)功能。在我們的CQT實(shí)現(xiàn)的內(nèi)部循環(huán)中執(zhí)行任何浮點(diǎn)運(yùn)算會使代碼減慢一個數(shù)量級,從而以幻燈片形式轉(zhuǎn)換LED可視化(現(xiàn)在我知道如何使用舊GPU)。為了解決這個問題,我們使用了一個臨時的定點(diǎn)數(shù)字格式,使用了10個小數(shù)位。這是一個復(fù)雜的乘法,但完成了工作。
-
微處理器
+關(guān)注
關(guān)注
11文章
2274瀏覽量
82698 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5121瀏覽量
98036
原文標(biāo)題:完整項(xiàng)目 | 用1280個led和PIC32開發(fā)板制作可控光立方音樂頻譜(附最詳細(xì)的光立方圖文教程+電路圖+源代碼)
文章出處:【微信號:cirmall,微信公眾號:電路設(shè)計(jì)技能】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論