提高开发效率和质量?用SPICE仿真音效
我在网上查找音效电路原理图时想到,如果能在出图前先用通用模拟电路仿真器(SPICE)进行模拟检验,可能会提高开发效率和质量。但由于任何电子模拟器都无法读取并输出音频文件,所以我用Pythons波形模块编写程序,实现读取波形文件并且输出一段时间--电压点的序列。Ngspice的文件源装置能够读取这一大串点序列,并输出和音频信号相匹配的电压波形,之后作为效果电路的输入。
本文引用地址:https://www.eepw.com.cn/article/264466.htm为了能听到输出音频,还需另外一个程序将输出跟踪转换成波形文件,这里我还是借助于这个Pythons波形模块来实现。
过载效果器250
过载效果器250是最简单的畸变效应之一,以吉他效果而广为人知。原理图如图所示。工作原理很简单,首先需要一个交流耦合电容和偏置电路,因为供电采用单向电压。
运算放大器被用作非反相放大器放大微弱的输入信号。R5电位计控制增益。输出位置有另外一个交流耦合电容器和两个削波信号二极管。信号幅值越大,二极管的削波和畸变就越明显。
测试音频信号是一段纯净的吉他声响,来源于用户Khoon命名的freesound.org组织,没有专利许可费用,从根本上说这个属于公用的。
首先是经过500千欧R5电阻输出较为缓和的畸变。考虑到运算放大器的放大效应,输入幅值的选择尤为重要。这段录音中输入幅值为10 毫伏。从波形上我们发现,削波作用相当明显,因此在播放前需要检查输出音量。
如下图所示,逐渐减小R5的阻值会提高增益和畸变:
音频编辑器显示的失真的频谱效应:
原始纯净吉他声信号频谱
刺耳畸变信号频谱
以上分别是原始纯净吉他声信号和刺耳畸变信号的频谱,区别不是很明显。一些低频信号被交流耦合电容器过滤,由于畸变新增了高频信号。能量增加超出了整个带宽,但这只是SPICE到wav格式声音文件转换过程中的过渡表象。为了避免削波,这里选择最大信号增益来获取最大样本值,从而改变信号音量。
实际电路与之相比略有不同,不过这种模拟本身仍然很能说明问题。
在所需时间上,仿真与实际存在差别。在44100赫兹的采样频率下,大约需要5秒来仿真1秒的音频文件。如需要长时间的仿真并记录数据,可以使用SPICE声明记录下输出波形。
模糊效应
模糊电路
第二部分为模糊电路,除了运算放大器部分被分立晶体管所取代外,其余与之前的失真电路非常相似。
输入电压幅值对这部分电路的输出影响也很明显。
下面是1毫伏输入幅值下的仿真结果:
10毫伏输入幅值仿真结果为:
由于相似的二极管削波结构,其仿真结果与畸变电路相差不大。
二极管削波器
二极管削波器的波形比预想的要平滑得多。当然这也取决于信号电压和二极管参数。
用一对1N4148进行削波之后的1V 400Hz信号仿真
二极管削波之后的正弦波频谱
但即便如此,这个相对平滑的削波信号也包含许多高频谐波。
源码
源码参见这里:
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
模拟信号相关文章:什么是模拟信号
评论