audio 應用:聲波通訊(2)傳送原理
聲波通訊的一般流程
可以看到無論是傳送還是接受關鍵的都是中間過程,也就是需要傳輸的資訊內容轉換成聲音的過程,這個聲音到底是什麼呢?
每一段都是一個資訊的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.
這樣就可以是線整個過程的資料組合了,最後再呼叫輸出介面將資料輸出出去。
相關文章
- audio 應用:聲波通訊(3)接收原理
- audio 應用:聲波通訊(1)應用場景
- flutter: 深入通訊-傳送端Flutter
- 聊聊如何在Java應用中傳送簡訊Java
- liunx通過TCP傳送資訊TCP
- 0x2_訊息的傳送
- 醫用超聲波(一)
- iOS12系統應用傳送普通郵實現傳送iOS
- QYT多鏈路融合通訊閘道器(應急通訊、車載通訊、影片傳輸)應用
- 使用Java客戶端傳送訊息和消費的應用Java客戶端
- 乾元通多鏈路融合通訊閘道器在應急通訊、車載通訊、影片傳輸方向的應用
- facebook web端傳送應用通知邀請Web
- 通訊原理中碼元,碼元傳輸速率,資訊傳輸速率
- 即時通訊傳送檔案的方法有幾種?
- 關於透明傳輸在通訊中的應用淺談
- SAP UI5 應用的 OData 後設資料請求的傳送原理分析UI
- 使用 laravel-wechat-notification 傳送微信模板訊息、企業微信應用訊息Laravel
- 「實戰」搭建完整的IM(即時通訊)應用(2)
- 瀏覽器跨 Tab 視窗通訊原理及應用實踐瀏覽器
- RocketMQ(八):訊息傳送MQ
- 【RocketMQ】MQ訊息傳送MQ
- 使用 Python 傳送簡訊?Python
- Unity元件:AudioChorusFilterPROonly音訊合聲濾波器Unity元件Filter音訊
- [傳智杯 #2 決賽] 傳送門
- 超聲波、毫米波、ToF鐳射雷達——在低功耗場景的應用選型
- Runtime底層原理探究(二) --- 訊息傳送機制(慢速查詢)
- 深入研究RocketMQ生產者傳送訊息的底層原理MQ
- websocket通訊原理Web
- 從 0 開始打造聊天室,搞定 Laravel 實時通訊 —— 傳送訊息Laravel
- SpringBoot 實現傳送簡訊Spring Boot
- Laravel SMS 簡訊傳送包Laravel
- 阿里雲簡訊傳送 sdk阿里
- 郵件和簡訊傳送
- TNW-傳送模板訊息TNW
- RocketMQ(九):訊息傳送(續)MQ
- 鴻蒙傳送訊息通知鴻蒙
- 6-RocketMQ傳送訊息MQ
- java 阿里雲簡訊傳送Java阿里