使用LPC1700的IEC 60601-1-8音頻警報發生器
圖1 雙抽頭IIR濾波器Goertzel演算法最有用的遞歸方法之一是Goertzel演算法;圖1顯示了一種簡單的雙抽頭IIR濾波器。這是非常有用的演算法,除了作為正弦波發生器以外,它還能被用作窄帶音調探測器。通過分析作為振蕩器的演算法,隨著以固定的跨度增大角度,我們想要能夠計算該角度的正弦值。假設能夠從正弦級數中的兩個以前的增量值來計算角度的正弦值,那麼針對圖1,就能寫出公式(1):
(1)在公式(1)中,x和y是IIR濾波器的係數,「a」是起始角,而「b」是增量角。為了找出兩個係數的值,重新整理並簡化公式1,如公式2所示。
(2)通過代入下列三角恆等式,繼續擴展公式2:
(3)我們得出:
重新整理:
(5)為了確保此式對於所有n都成立,必須讓括弧中的兩個表達式滿足:
(6)當求解時,這就能得出用於遞歸IIR濾波器的係數:
(7)將它代回到原始公式中,得出:
(8)重新整理:
(9)代入樣品值Y[n]=sin(a+nb),得出:
(10)由於係數之一等於-1,所以在每個步距角增量處的計算就只需要涉及兩個以前計算結果的一個乘法和一個減法(假設係數已事先計算出來)。在運行了上面的公式後,y[-1]值被移入到y[-2]變數中,並且將計算出的y[n]值移入到y[-1]變數中,以準備在下一個步距角處的計算。這促進了Cortex-M3非常有效的運行。Goertzel初始化為了讓Goertzel能夠作為振蕩器發揮作用,y[-1]和y[-2]值必須要進行初始化。如果我們設y[-1]=0,那麼y[-2]應該具有在零交叉之前的一個增量正弦值的值,或者:
(11)係數也必須在下面的公式12中計算。
為了將Goertzel演算法作為音調探測器使用,y[-1]和y[-2]二者都應該被初始化到「0」。然後,輸入應該加入到計算中。在特定數量的樣品之後,輸入在探測頻率處的振幅就能夠從下列公式來計算:
存在關於此式的優化形式,以簡化數學運算,但這裡只是為了解釋原理。為了將它用作連續的音調探測器,在執行了此計算之後,y[-1]和y[-2]應該再次設定為零,然後進行下一個採集和探測順序。代碼實施-音頻報警合成定時信號發生器代碼定時信號發生器代碼包括定時器0的初始化,以及用於處理定時器0中斷的中斷服務程序。這提供用於生成報警音調的40μs(25kHz)定時,以及軟體計數器生成的1ms定時。後者被包絡發生器和音符定序器所用。定時器0初始化定時器0需要進行初始化,以每隔40μs生成一個匹配中斷,從而提供25kHz的採樣速率。下面給出了初始化代碼。
定時器0中斷服務程序定時器0中斷服務程序是本應用程序的心臟,因為它為音調生成以及音調定序提供所有計時。本代碼進行試驗,以查看包絡是否啟用,如果是,它將輸出音調。除了清除中斷以外,軟體計數器被遞增,直到達到1ms的超時。在每一次1ms超時發生時,定序器的狀態就被遞增,而且任何需要的動作將由包絡發生器執行(將在以後討論)。下面顯示了關於定時器0中斷服務程序的代碼列表。
包絡控制功能包絡發生器控制音調的動態水平,因為IEC60601-1-8要求上升時間和下降時間應該處在規定的範圍內。還有,報警順序中的第一個音符的振幅應該低於其它音符。包絡發生器輸出是變數「包絡」。當音調關閉時,包絡=0。當在順序中打開一個音符時,包絡變數將每毫秒以設定的速率增大,直到它達到設定的最大水平。當音符關閉時,音調繼續,但包絡變數開始以其設定的速率減小,直到它達到「0」。包絡變數將被用作音符的動態特徵的音量控制。下面給出了包絡控制功能的列表:
音符定序器功能 音符定序器為IEC60601-1-8中規定的不同報警旋律提供計時和音符定序。高級優先權報警包括重複的5音符順序。相同報警範疇的中等優先權形式使用其高級優先權報警的前三個音符,但不重複。高級優先權報警的音符間隔和持續時間比較短,因為這能給出緊急程度的較高感覺。以高級優先權為例,下面顯示了實施這些功能的代碼。在定時器0中斷服務程序中討論的1ms時基增大順序計數器。作為其結果,與每個情況語句相關聯的數字均以毫秒為單位,以方便計時期間的調整。中等和低級優先權形式使用相同的基本開關語句格式和類似的函數調用,但是,由於節拍不同,在相關的情況語句中使用了不同的計時狀態。
音符發生器功能 對於音符發生器,存在許多需要處理的數據,它們涉及到多重頻率和多重正弦波發生器。如果將與每個頻率相關的數據變數和常數組織在具有相同尺寸的矩陣中,那麼就能恰好使用簡單遞歸函數來「走」過這些矩陣數據。
音符發生器定義 定義若干個定點和浮點常數,以及定義結構標籤和兩個矩陣。它們當中之一是結構的一個矩陣。演算法中使用的變數和係數之結構的優點是:它允許我們在結構矩陣和頻率常數矩陣中具有類似的矩陣組織。常數頻率矩陣和演算法結構矩陣之間的一一對應關係使得在初始化每個頻率時,容易使用兩個矩陣的類似索引。音符發生器初始化 上文提到為了使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的過度取樣。用戶/命令介面對於為本應用程序編寫的演示固件,Keil MCB1700被確定為目標板,而UART1則被用來提供菜單驅動的終端介面,以激活不同的報警。為了保持應用規格書的簡明性,本文沒有顯示UART代碼。只顯示了命令功能之一的代碼示例,作為如何使用本固件來啟動報警順序的演示。
啟動報警順序需要的全部工作是使用「報警」變數設定報警類型,然後通過將「順序」變數設定到一個非零值而啟用定序器。IEC60601-1-8音頻報警演示操作複位菜單MCB1700載入完IEC音頻報警固件後,當MCB1700上的COM1介面連接到運行HyperTerminal、TeraTerm或類似終端程序的PC上時,複位以後,用戶就會看到具有下列菜單的提示:串口設置為9600比特率、一個開始位、一個停止位、無奇偶校驗、無流量控制。
圖2 複位菜單
圖3 高級優先權報警菜單按下1到8之間的任意一個數字,然後按下回車,將開始對應報警類型的高級優先權報警順序。類似的菜單動作將針對中等優先權、低級優先權和試驗菜單而獲得,參見圖4、圖5、和圖6中所示。
圖4 中等優先權菜單
圖5 低級優先權菜單
圖6 和試驗菜單試驗菜單中的命令提供了具有諧波的最高和最低頻率音調的短1秒脈衝,以及本應用程序所需要的最高和最低單一頻率音調。這是為了方便進行性能試驗。單一音調的生成是通過讓『ToneWeights』矩陣中的所有值都等於0,但正在生成的隔離音調除外。命令5將所有ToneWeights矩陣值都複位到它們的初始值。外部硬體要求外部DAC濾波器對於在應用規格書中做的試驗,增加了一個簡單的三極RC濾波器,以便從信號中過濾掉25kHz採樣速率分量。使用的濾波器如圖7所示,它提供的截取頻率範圍處在9kHz到10kHz。由於樣品速率高於正常人類聽覺範圍,所以沒有濾波器,成本敏感的應用程序就可以通過。另外,在這個網路之後通常需要一個耦合電容器,因為DAC的直流電平一般為1.65 V。
圖7 三極RC DAC濾波器如果不打算成為高的阻抗輸入,或者這個信號是外部固定的,那麼建議使用緩衝器。性能分析 通過使用上一段描述的輸出濾波器,執行了波譜分析試驗,以驗證信號的頻譜含量,並估計信噪比。此外,還進行了示波器捕捉,以顯示生成的警報音調的升降和其它瞬時特徵。MCB1700 DAC的輸出被饋送到Mackie CR1604-VLZ音頻混合器(用於平頻率響應的EQ集),以便給筆記本電腦內部Sigmatel Codec提供正確的電平。筆記本電腦正在運行True Audio的TrueRTA波譜分析儀軟體包。前文已詳細描述過的試驗菜單被用來提供分析中使用的試驗音調脈衝。利用DAC濾波器的多重音調生成的波譜分析利用上文詳細描述的三極10kHz RC濾波器之後獲得的板輸出,進行下列波譜分析儀捕捉。具有諧波的應用程序(C4)中最低頻率音調的波譜如圖8所示。這些諧波在振幅方面互相非常接近。這將容易地滿足IEC 60601-1-8技術規格,因為它們只要求諧波處在互相之間15 dB的範圍內。信噪比看起來超過55dB,也能提供非常好的雜訊性能。波譜分析中顯示的缺少其它諧波也證明了由Goertzel演算法生成的正弦波的扭曲很低。
圖8 具有諧波的C4圖9顯示了在具有諧波的應用程序(C5)中最高頻率音調的波譜分析。由圖可知,具有諧波的C5音調的波譜也具有良好的信噪比和低扭曲,而且能夠將基本音符和諧波的振幅保持在幾個分貝的範圍內。
圖9 具有諧波的C5結論本應用中呈現的醫療報警的方法為符合IEC60601-1-8標準的音頻醫療警報提供了一種有效、低成本、高性能的方法。技術規格也說明,在報警聲音方面設備差異的細微程度對於操作人員是有利的。除了能滿足標準的要求以外,此處提供的固件實施允許容易地自定義音調,同時仍然能夠保持在技術規格參數範圍以內。基於ARM Cortex-M3內核的NXP LPC17xx系列微控制器能提供非常高速度的性能和準確的定時,這特別適合於實施類似於本示例中使用的演算法。利用在96 MHz的頻率下運行的LPC1768處理器,本應用程序使用大約8 %的可用處理器帶寬和小於10K的代碼空間,這樣就為其它附加的應用程序留出了大量的代碼空間和處理能力。因此,非常容易將對IEC60601-1-8標準的支持增加到任何醫療電子應用中。
推薦閱讀:
※每日一宋詞+賞析音頻版:江城子 十年生死兩茫茫 蘇軾
※youtube的轉錄音頻功能介紹
※Audacity 音頻編輯器教程|調整音量
※Audacity 音頻編輯器教程|格式轉換
TAG:音頻 |