使用LPC1700的IEC 60601-1-8音頻警報(bào)發(fā)生器
對(duì)于音符發(fā)生器,存在許多需要處理的數(shù)據(jù),它們涉及到多重頻率和多重正弦波發(fā)生器。如果將與每個(gè)頻率相關(guān)的數(shù)據(jù)變量和常數(shù)組織在具有相同尺寸的矩陣中,那么就能恰好使用簡(jiǎn)單遞歸函數(shù)來“走”過這些矩陣數(shù)據(jù)。
音符發(fā)生器定義
定義若干個(gè)定點(diǎn)和浮點(diǎn)常數(shù),以及定義結(jié)構(gòu)標(biāo)簽和兩個(gè)矩陣。它們當(dāng)中之一是結(jié)構(gòu)的一個(gè)矩陣。
算法中使用的變量和系數(shù)之結(jié)構(gòu)的優(yōu)點(diǎn)是:它允許我們?cè)诮Y(jié)構(gòu)矩陣和頻率常數(shù)矩陣中具有類似的矩陣組織。常數(shù)頻率矩陣和算法結(jié)構(gòu)矩陣之間的一一對(duì)應(yīng)關(guān)系使得在初始化每個(gè)頻率時(shí),容易使用兩個(gè)矩陣的類似索引。
音符發(fā)生器初始化
上文提到為了使Goertzel算法能振蕩,除了系數(shù)以外,y[-1]和y[-2]值也必須初始化。必須針對(duì)對(duì)應(yīng)于每個(gè)頻率的結(jié)構(gòu)變量而完成此工作。下面顯示了用于初始化的代碼。一排5個(gè)結(jié)構(gòu)中的每一個(gè)被初始化,然后每一個(gè)另外的排被初始化,直到整個(gè)結(jié)構(gòu)矩陣都被初始化。在這個(gè)演示應(yīng)用程序中,這些計(jì)算是在復(fù)位初始化期間完成的。不過,如果你正在最優(yōu)化它,可以通過事先進(jìn)行這些計(jì)算而將代碼保存起來,并且將結(jié)果作為常數(shù)儲(chǔ)存在快速存儲(chǔ)器中。這是因?yàn)?,如果?shù)學(xué)程序庫需要浮點(diǎn)和正弦/余弦算法,那么預(yù)先計(jì)算好的初始化值則不需要。這些程序庫例行程序使用大約一半本應(yīng)用程序中使用的代碼空間。系數(shù)和初始化值是通過32768(帶符號(hào)的短值)定標(biāo)的。還有,系數(shù)計(jì)算不包括公式(18)中顯示的2X系數(shù)。其目的是使系數(shù)的規(guī)模保持在帶符號(hào)的短值,以最小化儲(chǔ)存要求。2X被包括在最終Goertzel計(jì)算中;此處,輸出的定標(biāo)是通過>>14(而不是>>15)乘以2。
多重正弦波發(fā)生、求和及DAC輸出
一旦算法變量和系數(shù)都已經(jīng)被初始化,那么,讓Goertzel計(jì)算來生成基本音符和4個(gè)諧波就變得很容易。方法是簡(jiǎn)單地遞增通過結(jié)構(gòu)矩陣中的一排,并且求五個(gè)值的和。正如上文所述,第204行包括通過>>14、而不是>>15定標(biāo)到2X中的系數(shù),而這些系數(shù)在初始化時(shí)不予考慮。
一旦函數(shù)已經(jīng)完成了矩陣排中所有5個(gè)結(jié)構(gòu)的計(jì)算,相加的值就被定標(biāo)、格式化、并從帶符號(hào)的值轉(zhuǎn)化為不帶符號(hào)的值,然后被送到DAC。由于這些計(jì)算是在每個(gè)25kHz定時(shí)器中斷處執(zhí)行的(當(dāng)音符活躍時(shí)),所以DAC輸出速率就是25 kHz。這允許使用便宜的輸出濾波器,因?yàn)橄鄬?duì)于正在生成的最高正弦波頻率,這大約是9X的過度取樣。
評(píng)論