audio 應用:聲波通訊(2)傳送原理

迷霧綠洲發表於2018-11-10

聲波通訊的一般流程聲波通訊流程
可以看到無論是傳送還是接受關鍵的都是中間過程,也就是需要傳輸的資訊內容轉換成聲音的過程,這個聲音到底是什麼呢?
聲波通訊的資訊
每一段都是一個資訊的bit,這裡很容易認為是通過這些資訊bit的輸出幅度來判定對應的是哪個ASCII碼的,現實的情況是這樣做基本不可能實現,音量的大小解析度很低,通訊雙方的距離、播放裝置和接收裝置的擺放角度和輸出幅頻響應都會嚴重影響最終的結果。聲音的一個頑疾‘回聲’更是會造成干擾。
我們換個角度看這些聲波,從頻域看一看
聲波通訊的頻域資訊
可以看到這些波形其實是不同的頻率的訊號連線而成的,關於時域和頻域的理解在大學講的還是比較詳細的,通過一個圖也能夠看清楚:
在這裡插入圖片描述
將時間軸的資訊轉換了能量維度。
選用的都是正弦訊號,方波訊號 三角波都存在其他頻率分量,為了儘量減少其他的干擾。
生成方法是選用中學只是的正餘弦公式
Y = sin( (2 *PI *Frequency) / SampleRate)
PI 就是常數3.14,Frequency是想要輸出的頻率,SampleRate 是取樣率。
比如想要輸出的是8KHZ訊號,取樣率是48K
正弦波輸出公式

Frequency = 8000
SampleRate  = 48000
for(i=0;i<SampleRate  /Frequency ;i++)
data_out =  sin( (2 *PI *i)/(SampleRate  /Frequency) )

通過上面的過程我們就獲得了一個完整的8KHZ正弦波的數值,但是這個數值是0~1的值,這裡還需要根據輸出訊號位寬進行放大,
例如輸出是16bit的位寬的訊號,pcm 訊號有極性,輸出的最大正值是0x7ffff
sample_out = data_out * 0x7ffff
sample_out 就是最後寫入到硬體fifo 傳送到dal來播放的資料了。
有了任意頻率的訊號公式夠我們需要建立一個頻率和傳輸資料對應的一個表,建立一個查詢表的陣列解決這個問題,
在這裡插入圖片描述
這個函式輸入時 0,1,2,3。。。輸出就是對應頻率的count值,
由於不同頻率的訊號每週期的取樣點是不一樣的,為了獲得不同資料輸出時間相同長度的資料訊號,這裡建立一個cyc_count的陣列,這個陣列是頻率訊號的週期數量。越大頻率的訊號週期越大。如果沒有這個控制,就會出現高頻的資料輸出時間很短,很容易檢測不到這個bit.
這樣就可以是線整個過程的資料組合了,最後再呼叫輸出介面將資料輸出出去。
在這裡插入圖片描述

相關文章