一年前寫了一個demo,用於生成幾種標准的波形,如正弦波、方波、三角波。之前寫的只有這幾個功能:波形/通道/時長/頻率的控制選擇,這幾天抽了些時間又加了增益控制功能。為了避免東西丟失或意外刪除,特上傳到github,有需要的可以自己下載驗證。
在測量板子信號時,我們根據需要生成波形(wav封裝),將得到的文件放到板子存儲設備中進行播放。記得以前調試時都是找一個同事(一個好耍的憨厚朴實純真的兄弟,名字叫jiawei)臨時要的,然而數量畢竟有限,因為我可能需要不同采樣率/通道/增益/頻率組合的信號。。。
下面結合git倉庫中的CStandardWaveGenerator和Adobe Audition來介紹聲音的一些概念。像聲道、采樣率、增益、頻率、時長等概念。以后有時間了再另起博文補充傅里葉變換,利用這個demo生成所需要的信號源。
示例介紹
生成信號:正弦波 + 時長100ms + 周期10ms(頻率100Hz) + 單聲道 + 8k采樣率 + 單聲道 + 6dB
執行命令:./StandardWaveGenerator.exe 0 100 10 8000 1 -6
附帶信息:get sin.wav with sample_rate=8000, channle=1, duration=100 ms, period=10 ms, gain=-6 dB, pcmLen:1600
得到文件sin.wav,用Audition解讀:
信號解讀
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。