標准pcm數據(正弦波、方波、三角波)解讀


一年前寫了一個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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM