使用LPC1700的IEC 60601-1-8音頻警報發(fā)生器
對于音符發(fā)生器,存在許多需要處理的數據,它們涉及到多重頻率和多重正弦波發(fā)生器。如果將與每個(gè)頻率相關(guān)的數據變量和常數組織在具有相同尺寸的矩陣中,那么就能恰好使用簡(jiǎn)單遞歸函數來(lái)“走”過(guò)這些矩陣數據。


音符發(fā)生器定義
定義若干個(gè)定點(diǎn)和浮點(diǎn)常數,以及定義結構標簽和兩個(gè)矩陣。它們當中之一是結構的一個(gè)矩陣。
算法中使用的變量和系數之結構的優(yōu)點(diǎn)是:它允許我們在結構矩陣和頻率常數矩陣中具有類(lèi)似的矩陣組織。常數頻率矩陣和算法結構矩陣之間的一一對應關(guān)系使得在初始化每個(gè)頻率時(shí),容易使用兩個(gè)矩陣的類(lèi)似索引。
音符發(fā)生器初始化
上文提到為了使Goertzel算法能振蕩,除了系數以外,y[-1]和y[-2]值也必須初始化。必須針對對應于每個(gè)頻率的結構變量而完成此工作。下面顯示了用于初始化的代碼。一排5個(gè)結構中的每一個(gè)被初始化,然后每一個(gè)另外的排被初始化,直到整個(gè)結構矩陣都被初始化。在這個(gè)演示應用程序中,這些計算是在復位初始化期間完成的。不過(guò),如果你正在最優(yōu)化它,可以通過(guò)事先進(jìn)行這些計算而將代碼保存起來(lái),并且將結果作為常數儲存在快速存儲器中。這是因為,如果數學(xué)程序庫需要浮點(diǎn)和正弦/余弦算法,那么預先計算好的初始化值則不需要。這些程序庫例行程序使用大約一半本應用程序中使用的代碼空間。系數和初始化值是通過(guò)32768(帶符號的短值)定標的。還有,系數計算不包括公式(18)中顯示的2X系數。其目的是使系數的規模保持在帶符號的短值,以最小化儲存要求。2X被包括在最終Goertzel計算中;此處,輸出的定標是通過(guò)>>14(而不是>>15)乘以2。

多重正弦波發(fā)生、求和及DAC輸出
一旦算法變量和系數都已經(jīng)被初始化,那么,讓Goertzel計算來(lái)生成基本音符和4個(gè)諧波就變得很容易。方法是簡(jiǎn)單地遞增通過(guò)結構矩陣中的一排,并且求五個(gè)值的和。正如上文所述,第204行包括通過(guò)>>14、而不是>>15定標到2X中的系數,而這些系數在初始化時(shí)不予考慮。

一旦函數已經(jīng)完成了矩陣排中所有5個(gè)結構的計算,相加的值就被定標、格式化、并從帶符號的值轉化為不帶符號的值,然后被送到DAC。由于這些計算是在每個(gè)25kHz定時(shí)器中斷處執行的(當音符活躍時(shí)),所以DAC輸出速率就是25 kHz。這允許使用便宜的輸出濾波器,因為相對于正在生成的最高正弦波頻率,這大約是9X的過(guò)度取樣。
評論