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


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

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

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