一年前寫了一個demo,用於生成幾種標準的波形,如正弦波、方波、三角波。以前寫的只有這幾個功能:波形/通道/時長/頻率的控制選擇,這幾天抽了些時間又加了增益控制功能。爲了不東西丟失或意外刪除,特上傳到github,有須要的能夠本身下載驗證。git
在測量板子信號時,咱們根據須要生成波形(wav封裝),將獲得的文件放到板子存儲設備中進行播放。記得之前調試時都是找一個同事(一個好耍的憨厚朴實純真的兄弟,名字叫jiawei)臨時要的,然而數量畢竟有限,由於我可能須要不一樣採樣率/通道/增益/頻率組合的信號。。。github
下面結合git倉庫中的CStandardWaveGenerator和Adobe Audition來介紹聲音的一些概念。像聲道、採樣率、增益、頻率、時長等概念。之後有時間了再另起博文補充傅里葉變換,利用這個demo生成所須要的信號源。spa
示例介紹調試
生成信號:正弦波 + 時長100ms + 週期10ms(頻率100Hz) + 單聲道 + 8k採樣率 + 單聲道 + 6dBblog
執行命令:./StandardWaveGenerator.exe 0 100 10 8000 1 -6get
附帶信息:get sin.wav with sample_rate=8000, channle=1, duration=100 ms, period=10 ms, gain=-6 dB, pcmLen:1600it
獲得文件sin.wav,用Audition解讀:io
信號解讀音頻
1.單雙聲道(channel)下載
這個通俗講,你用幾個mic去採集信號。若是是雙聲道,則上圖有兩個波形。雙聲道每次採樣數據量爲:2chn * 16bit(s16le) = 4Bytes
2.採樣頻率(sample_rate)
這個要與信號頻率(週期信號的頻率)作下區別。這個是指:每秒鐘的採樣次數。
就如上面示例圖示,採樣頻率是8k,表明着1s內進行了8000次採樣,而只保留了100ms的信號,所以數據量大小:8000 * 2Bytes * (100/1000) = 1600Bytes,從命令輸出信息也可看到。
3.時長(duration)
這個文件的時間長度,示例中是100ms
4.信號頻率/信號週期(frequence/period)
這個值表明信號多長時間後又開始重複,上面示例中使用了這個「period=10 ms」來控制,即T=10ms,那麼f=1/T=100Hz,從圖示下半部分能夠看出信號的頻率是100(明顯的一條黃帶)。
5.增益(gain)
這個能夠表示聲音的響度,其具體含義是信號與某一個值對比:20lg(V1/V2),在音頻裏則與最大值V2=215=32768進行對比,那麼-6dB的信號能夠算出來其值爲:214=16384
例如,若是咱們從文件中去找出最大值是多少來確認是否屬實,能夠按如下這麼操做:
step1. 半波最大pcm值採樣序號:10ms * (1/4) / 1000ms * 8000 = 20
step2. 在文件中的offset:44 + 20*2 = 84 = 0x54,其中44爲wav_header,20*2中的2表明每次採樣的2Bytes
step3. 用winhex進行查找(alt+g):獲得 25 40
step4. 25 40表明值多少呢?因爲存儲格式爲S16LE,S(signed)表明有符號,LE(little endian)爲小端存儲(先存低字節,再存高字節),那麼這個採樣值爲0x4025 = 16421,大致上接近理論值16384。