提高開(kāi)發(fā)效率和質(zhì)量?用SPICE仿真音效
我在網(wǎng)上查找音效電路原理圖時(shí)想到,如果能在出圖前先用通用模擬電路仿真器(SPICE)進(jìn)行模擬檢驗(yàn),可能會(huì)提高開(kāi)發(fā)效率和質(zhì)量。但由于任何電子模擬器都無(wú)法讀取并輸出音頻文件,所以我用Pythons波形模塊編寫(xiě)程序,實(shí)現(xiàn)讀取波形文件并且輸出一段時(shí)間--電壓點(diǎn)的序列。Ngspice的文件源裝置能夠讀取這一大串點(diǎn)序列,并輸出和音頻信號(hào)相匹配的電壓波形,之后作為效果電路的輸入。
本文引用地址:http://butianyuan.cn/article/264466.htm為了能聽(tīng)到輸出音頻,還需另外一個(gè)程序?qū)⑤敵龈欈D(zhuǎn)換成波形文件,這里我還是借助于這個(gè)Pythons波形模塊來(lái)實(shí)現(xiàn)。
過(guò)載效果器250
過(guò)載效果器250是最簡(jiǎn)單的畸變效應(yīng)之一,以吉他效果而廣為人知。原理圖如圖所示。工作原理很簡(jiǎn)單,首先需要一個(gè)交流耦合電容和偏置電路,因?yàn)楣╇姴捎脝蜗螂妷骸?/p>
運(yùn)算放大器被用作非反相放大器放大微弱的輸入信號(hào)。R5電位計(jì)控制增益。輸出位置有另外一個(gè)交流耦合電容器和兩個(gè)削波信號(hào)二極管。信號(hào)幅值越大,二極管的削波和畸變就越明顯。
測(cè)試音頻信號(hào)是一段純凈的吉他聲響,來(lái)源于用戶Khoon命名的freesound.org組織,沒(méi)有專(zhuān)利許可費(fèi)用,從根本上說(shuō)這個(gè)屬于公用的。
首先是經(jīng)過(guò)500千歐R5電阻輸出較為緩和的畸變??紤]到運(yùn)算放大器的放大效應(yīng),輸入幅值的選擇尤為重要。這段錄音中輸入幅值為10 毫伏。從波形上我們發(fā)現(xiàn),削波作用相當(dāng)明顯,因此在播放前需要檢查輸出音量。
如下圖所示,逐漸減小R5的阻值會(huì)提高增益和畸變:
音頻編輯器顯示的失真的頻譜效應(yīng):
原始純凈吉他聲信號(hào)頻譜
刺耳畸變信號(hào)頻譜
以上分別是原始純凈吉他聲信號(hào)和刺耳畸變信號(hào)的頻譜,區(qū)別不是很明顯。一些低頻信號(hào)被交流耦合電容器過(guò)濾,由于畸變新增了高頻信號(hào)。能量增加超出了整個(gè)帶寬,但這只是SPICE到wav格式聲音文件轉(zhuǎn)換過(guò)程中的過(guò)渡表象。為了避免削波,這里選擇最大信號(hào)增益來(lái)獲取最大樣本值,從而改變信號(hào)音量。
實(shí)際電路與之相比略有不同,不過(guò)這種模擬本身仍然很能說(shuō)明問(wèn)題。
在所需時(shí)間上,仿真與實(shí)際存在差別。在44100赫茲的采樣頻率下,大約需要5秒來(lái)仿真1秒的音頻文件。如需要長(zhǎng)時(shí)間的仿真并記錄數(shù)據(jù),可以使用SPICE聲明記錄下輸出波形。
模糊效應(yīng)
模糊電路
第二部分為模糊電路,除了運(yùn)算放大器部分被分立晶體管所取代外,其余與之前的失真電路非常相似。
輸入電壓幅值對(duì)這部分電路的輸出影響也很明顯。
下面是1毫伏輸入幅值下的仿真結(jié)果:
10毫伏輸入幅值仿真結(jié)果為:
由于相似的二極管削波結(jié)構(gòu),其仿真結(jié)果與畸變電路相差不大。
二極管削波器
二極管削波器的波形比預(yù)想的要平滑得多。當(dāng)然這也取決于信號(hào)電壓和二極管參數(shù)。
用一對(duì)1N4148進(jìn)行削波之后的1V 400Hz信號(hào)仿真
二極管削波之后的正弦波頻譜
但即便如此,這個(gè)相對(duì)平滑的削波信號(hào)也包含許多高頻諧波。
源碼
源碼參見(jiàn)這里:
README
SPICE audio tools
This repository has two programs for importing wav file to SPICE and
exporting the output as a wav file.
1. wavtospice.py
- This tool converts a wav file with a list of values, which can be read
using ngspices file source. If wav file has multiple channels only the values
of the first channel are returned.
- Usage: python wavtospice.py
- Ngspice must have been compiled with xspice support. File source can be used
like follows:
a1 %v([in]) filesrc
.model filesrc filesource (file="values" amploffset=[0] amplscale=[1]
+ timeoffset=0 timescale=1
+ timerelative=false amplstep=false)
See ngspice manual for possible options.
2. spicetowav.py
- This tool converts ngspice output to wav file. Compatibility with other
simulators is untested.
- Simulation must be setup to print the output values.
Run the ngspice in batch mode using the command line flag -b and direct
output to a file.
- Usage: python spicetowav.py
Clipping voltage is optional and if it's unspecified wav is written
with maximum amplitude such that clipping doesn't occur.
# Example
Following commands can be used to get output from lowpass filter example file
when run on Linux:
$ python wavtospice.py file.wav inputvalues
$ ngspice -b examples/lowpass.cir > spice_output
$ python spicetowav.py spice_output output.wav
模擬信號(hào)相關(guān)文章:什么是模擬信號(hào)
評(píng)論