提問
老師,這個波形為什么抓取出來是這個樣子?應該是連續的 sin 吧?這個是從你發的網盤鏈接里面下載的 我用播放器畫出的波形。
聲音信號繪制波形
聲音聽起來是下面“失真的 Chirp”聲音:
我自己使用單片機, 發出的聲音不太一樣,但是波形就是您之前推文里的那個,就像下面的波形圖所顯示的那樣。
剛才是我自己單片機生成的波形 老師發的 chirp.wav,用 Matplot 沒問題。但是從喇叭里面發出來,就會很奇怪,而且播放器上面的波形也不對。
自己使用單片機產生的波形
問題回復
問題分析
在生成最終的聲音 .wav 文件的時候,使用的是 16bit 整型數。在 python 程序中為:
wavefile.setparams((1, 2, 10000, wavelen, 'NONE', 'Tsinghua'))
函數中的參數定義分別是:(nchannels, sampwidth, framerate, nframes, comptype, compname),
生成 wave 波形數據使用公式如下,這將產生帶有符號的 16 位整形數字:
Chip 波形前面 300 個數據點繪制的波形如下:
有符合 16 位整型數波形
在寫入 wave 文件之前,需要將生成的數據轉換成無符號整形數字,使用二進制補碼方式進行轉換:
sd = int(sin(angle * 2 * pi) * 0x3fff)
if sd < 0: sd = 0x10000+sd
這樣 wave 文件的波形就變成如下圖所示了:
修改成有符合整型數的波形
而在之前沒有按照二進制補碼方式轉換,而是直接采用 16 位無符號整形數來表示音頻數據,轉換的程序代碼如下:
sd = int(sin(angle * 2 * pi) * 0x3fff) + 0x7fff
這樣繪制出來的波形如下。雖然它的波形完整,但與 .wav 文件所使用的有符號 16 位整型數據不符合,所以播放出來的聲音出現較大的失真。
無符號 16 整型數波形
產生聲音文件的 PYTHON 程序
正確 WAVE 文件格式的 Chirp 聲音文件下載地址:
鏈接:
https://pan.baidu.com/s/19qLZbABSISm8q2gA2V6Afw
提取碼: wrk2