Python实时表现力数字信号处理(DSP)包!
项目描述
开发 |
|
---|---|
上次发布 |
|
PyPI状态 |
懒惰和对象表示
有几个工具和包可以让Python的使用和表现力类似于MatLab和Octave等语言。然而,大多数这些工具所进行的贪婪评估使得它们难以用于实时音频处理,甚至可能不可能。为了避免这种贪婪,可以在数据请求时进行计算,而不是在给定数据路径时进行计算。这是懒惰的核心思想,允许
实时应用(您不需要等待所有数据都处理完成才能得到结果);
无限数据序列表示;
数据流表示;
当执行逆向任务时进行任务消除:不需要执行任何操作来撤销,也不需要对那个操作进行有意识的优化。
另一个困难是使用索引和向量在块中创建用于音频处理的表达性代码。有时这是不可避免的,或者至少避免这种情况会限制处理序列数据系统的能力。
可以从样本序列中找到块序列,其中后者可以是前者的方法或函数的结果。这样的信息需要块大小和下一个块开始的地址。虽然人们可以思考最后一个块和它开始的精确索引,但大多数在这种情况下花费的时间是实施问题,这只是为了将注意力从正在解决的问题上转移开。为了允许类似无限数据序列的东西,不需要知道何时停止。
工程师可能会发现使用电气工程理论中的方程和结构比将这些内容全部存储到数据数组中更容易理解,特别是在对这些表示进行常见操作时。具有分子[1, 7, 2]和分母[1, 0.5, 0.2]的系统方程的滤波器与数组反向如[2, 7, 1]的滤波器的乘积是什么?这可能是简单的,反转可以避免像“先来的是零还是负二指数?”这样的问题,但如果我们有更简单的东西,可能会更高效:乘法可以一次性写出来,并且用程序员习惯看到的表现形式。如果能够消除filt1.multiply_by(filt2)这样的方法调用的不对称性,这将更有表达性,因为在这种情况下乘法应该是可交换的。在允许操作符重载的语言中,自然运算符的使用是可能的,但为此我们需要将那些方程和结构描述为对象和对象关系。
名称Hz可以是一个允许转换为默认DSP内部rad/samples单位的数字,因此可以写成freq = 440 * Hz这样的形式。在大多数语言中这并不困难,但已经有助于表达性。如果(几乎)所有东西都需要“样本”或“rad/sample”单位的数据,那么将“秒”和“赫兹”转换为这些常数的常数将有助于代码的表达性。一个梳状滤波器comb.tau(delay=30*s, tau=40*s)可以表示具有给定延迟和时间的梳状滤波器,两者都在样本中,但比[1] + [0] * 239999 + [alpha]这样的表达式对读者来说更清晰。在仅仅使用滤波器来获取频率响应图时,有必要存储所有那些零吗?
通过选择合适的常量、鸭子类型、重载运算符、将函数作为一等公民、面向对象与函数式编程风格相结合等,可以避免这些问题,这些都是Python语言免费提供给我们的资源。
它是做什么的?
优先考虑代码的可读性、清晰性和简单性,不排除惰性评估,并旨在与Numpy、Scipy和Matplotlib以及Python的默认结构如列表和生成器等一起使用,AudioLazy是一个用纯Python编写的包,提出数字音频信号处理(DSP),具有以下特点:
一个Stream类,用于有限和无限信号的表示,其中包含元素级运算符(与不可迭代对象的自动广播)在通用的Python可迭代容器中,接受异构数据;
基于样本的强表示(Stream类),通过
Stream.blocks(size, hop)
方法轻松转换为块表示;使用
ControlStream
进行基于样本的交互式处理;给定起始时间差分,
Streamix
混音器用于可迭代对象;与PyAudio的多线程音频I/O集成;
使用Z变换滤波器直接作为等式进行线性滤波(例如:
filt = 1 / (1 - .3 * z ** -1)
),包括线性时变滤波器(即a
在a * z ** k
中可以是Stream实例),级联滤波器(表现为滤波器列表),谐振器等。每个LinearFilter
实例在调用时即时编译;与MatPlotLib集成的零点极点图和频率响应绘图;
直接将线性预测编码(LPC)转换为
ZFilter
实例,从中可以找到PARCOR系数和LSFs;提供基于样本(例如,零交叉率、包络、移动平均、截断、展开)和基于块(例如,窗口函数、DFT、自相关、滞后矩阵)的分析和处理工具;
一个简单的合成器(查找表、Karplus-Strong),带有处理工具(线性ADSR包络、淡入/淡出、固定持续时间线流)和基本波形数据生成(正弦波、白噪声、脉冲);
生物听觉外围建模(ERB和gamma滤波器模型);
将多个实现组织为
StrategyDict
实例:可调用的字典,允许具有相同名称的多个不同实现(例如erb
、gammatone
、lowpass
、resonator
、lpc
、window
);MIDI音高数字、字符串(如“F#4”)和频率之间的转换器;
多项式,来自itertools、math、cmath等的Stream函数!试试看!=)
安装
该软件包在Linux和Windows上都适用。您可以在PyPI找到最新的稳定版本,并使用常规Python安装机制进行安装
python setup.py install
如果您有pip,可以直接安装(使用-U
进行更新或重新安装)
pip install audiolazy
用于下载(从PyPI)和为您安装软件包
pip install -U .
从包含setup.py
文件和已解压缩的软件包数据的路径安装
对于最新版本,您可以直接从github存储库安装(需要git进行克隆)
pip install -U git+git://github.com/danilobellini/audiolazy.git
对于旧版本,您可以从PyPI链接或直接从github存储库安装,基于存储库标签。例如,要安装版本0.04(需要git进行克隆)
pip install -U git+git://github.com/danilobellini/audiolazy.git@v0.04
除了Python本身(版本2.7、3.2或更高版本)及其标准库之外,该软件包的核心没有其他强烈依赖,但您可能需要
PyAudio:用于播放和录制音频(
AudioIO
类);NumPy:用于进行一些数学计算,例如从滤波器中找到LSFs或从多项式中找到根;
MatPlotLib:用于所有默认绘图,例如在
LinearFilter.plot
方法和几个示例中;SciPy(仅用于测试和示例):用作LTI滤波器测试的预言者和Butterworth滤波器示例;
Sympy(仅用于测试):用于测试线性滤波器,其中Stream样本是符号系数的时间变化矩阵;
tox用于一次性测试所有内容,或pytest、pytest-cov和pytest-timeout用于在单个环境中测试(仅用于测试):运行测试套件并显示代码覆盖率状态;
wxPython(仅用于示例):用于一个包含交互式GUI的FM合成的示例;
Tkinter(仅用于示例):需要基于零交叉率的示例GUI的音高跟随器;
Music21(示例):该包中的示例从包的语料库中获取巴赫合唱作品,用于合成和播放;
Sphinx(仅文档):它可以使用几种不同的文件格式创建软件文档。
除了示例和测试之外,只有使用plot和zplot方法的过滤绘图需要MatPlotLib。到目前为止,需要NumPy的例程还包括:
使用zeros和poles属性(过滤类)或使用roots属性(多项式类)进行根查找;
一些线性预测编码(lpc)策略:nautocor、autocor和covar;
行频谱频率lsf和lsf_stable函数。
入门指南
在下面的所有示例之前,从audiolazy命名空间中获取一切更容易
from audiolazy import *
所有模块都以“lazy_”开头,但它们的数据已经加载到主命名空间中。这两行代码做的是同一件事
from audiolazy.lazy_stream import Stream
from audiolazy import Stream
无限可迭代对象与运算符(小心通过无限迭代器进行循环!)
>>> a = Stream(2, -2, -1) # Periodic
>>> b = Stream(3, 7, 5, 4) # Periodic
>>> c = a + b # Elementwise sum, periodic
>>> c.take(15) # First 15 elements from the Stream object
[5, 5, 4, 6, 1, 6, 7, 2, 2, 9, 3, 3, 5, 5, 4]
以及有限的迭代器(您可以将任何Stream视为具有逐元素运算符的生成器)
>>> a = Stream([1, 2, 3, 2, 1]) # Finite, since it's a cast from an iterable
>>> b = Stream(3, 7, 5, 4) # Periodic
>>> c = a + b # Elementwise sum, finite
>>> list(c)
[4, 9, 8, 6, 4]
从系统方程(Z变换)进行LTI滤波。之后,尝试求和、组合、乘以ZFilter对象
>>> filt = 1 - z ** -1 # Diff between a sample and the previous one
>>> filt
1 - z^-1
>>> data = filt([.1, .2, .4, .3, .2, -.1, -.3, -.2]) # Past memory has 0.0
>>> data # This should have internally [.1, .1, .2, -.1, -.1, -.3, -.2, .1]
<audiolazy.lazy_stream.Stream object at ...>
>>> data *= 10 # Elementwise gain
>>> [int(round(x)) for x in data] # Streams are iterables
[1, 1, 2, -1, -1, -3, -2, 1]
>>> data_int = filt([1, 2, 4, 3, 2, -1, -3, -2], zero=0) # Now zero is int
>>> list(data_int)
[1, 1, 2, -1, -1, -3, -2, 1]
LTI滤波器频率响应图(需要MatPlotLib)
(1 + z ** -2).plot().show()
除非您使用较新的MatPlotLib版本(在MatPlotLib 1.2.0上工作),否则matplotlib.figure.Figure.show方法将不起作用,但您仍然可以使用较旧的版本(例如MatPlotLib 1.0.1)直接将上述图形保存到PDF、PNG等。
(1 + z ** -2).plot().savefig("my_plot.pdf")
另一方面,您始终可以使用MatPlotLib直接显示图形
from matplotlib import pyplot as plt # Or "import pylab as plt"
filt = 1 + z ** -2
fig1 = filt.plot(plt.figure()) # Argument not needed on the first figure
fig2 = filt.zplot(plt.figure()) # The argument ensures a new figure
plt.show()
CascadeFilter实例和ParallelFilter实例是具有与列表相同操作符行为的滤波器列表,并且也适用于绘制线性滤波器。构造函数接受一个滤波器和包含滤波器的可迭代对象。例如,一个零点和极点图(需要MatPlotLib)
filt1 = CascadeFilter(0.2 - z ** -3) # 3 zeros
filt2 = CascadeFilter(1 / (1 -.8 * z ** -1 + .6 * z ** -2)) # 2 poles
# Here __add__ concatenates and __mul__ by an integer make reference copies
filt = (filt1 * 5 + filt2 * 10) # 15 zeros and 20 poles
filt.zplot().show()
线性预测编码(LPC)自相关方法分析滤波器频率响应图(需要MatPlotLib)
lpc([1, -2, 3, -4, -3, 2, -3, 2, 1], order=3).plot().show()
线性预测编码协方差方法分析和合成滤波器,随后是频率响应图和块数据DFT(MatPlotLib)
>>> data = Stream(-1., 0., 1., 0.) # Periodic
>>> blk = data.take(200)
>>> analysis_filt = lpc.covar(blk, 4)
>>> analysis_filt
1 + 0.5 * z^-2 - 0.5 * z^-4
>>> residual = list(analysis_filt(blk))
>>> residual[:10]
[-1.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
>>> synth_filt = 1 / analysis_filt
>>> synth_filt(residual).take(10)
[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0]
>>> amplified_blk = list(Stream(blk) * -200) # For alignment w/ DFT
>>> synth_filt.plot(blk=amplified_blk).show()
AudioLazy不需要任何音频卡来处理音频,但需要PyAudio来播放一些声音
rate = 44100 # Sampling rate, in samples/second
s, Hz = sHz(rate) # Seconds and hertz
ms = 1e-3 * s
note1 = karplus_strong(440 * Hz) # Pluck "digitar" synth
note2 = zeros(300 * ms).append(karplus_strong(880 * Hz))
notes = (note1 + note2) * .5
sound = notes.take(int(2 * s)) # 2 seconds of a Karplus-Strong note
with AudioIO(True) as player: # True means "wait for all sounds to stop"
player.play(sound, rate=rate)
有关更多信息,请参阅github存储库中的docstrings和“examples”目录。此外,庞大的测试套件可能有助于您了解该包的工作方式和如何使用它。
项目文件
在AudioLazy存储库中(以及源分布中)有几个文件和目录
文件/目录 |
描述 |
---|---|
audiolazy/ |
AudioLazy包模块源代码 |
audiolazy/tests/ |
测试子包 |
docs/ |
文档生成脚本 |
examples/ |
一些AudioLazy用例的示例 |
images/ |
一些reStructuredText文档文件引用的图像 |
math/ |
使用Sympy CAS对AudioLazy使用的某些公式的证明 |
CHANGES.rst |
AudioLazy历史,即变更日志 |
conftest.py |
为py.test配置,以便与缺少Numpy的环境的StrategyDict策略和doctests一起正常工作 |
COPYING.txt |
许可文件 |
MANIFEST.in |
包含在tarball中的额外文件列表,这些文件不需要与包一起安装 |
README.rst |
关于AudioLazy项目的某些一般信息 |
setup.py |
安装、测试等的一般Python设置脚本 |
tox.ini |
tox、py.test和pytest-cov的配置 |
.travis.yml |
Travis-CI配置(不在PyPI tarball/“egg”源分布中) |
对于AudioLazy用户来说,examples和math目录可能很有用。这两个目录中的所有Python文件都是脚本,旨在在Python 2和3上运行,除非它们需要Python 3尚未提供的某些内容(例如wxPython),大多数脚本都有一些外部依赖。
AudioLazy变更历史
* 版本0.6(示例、STFT、phon2dB、tox、CI、波形文件) *
示例
元音“ah-eh-ee-oh-oo”的共振峰合成
带有QWERTY键盘(也通过jack!)的音乐键盘合成示例
随机合成,具有保存和记忆功能
Tkinter GUI示例的美学设计
带有麦克风输入数据的Matplotlib动画绘图(也通过jack!工作!)
使用(Scipy)应用于白噪声的Butterworth滤波器进行感知实验(基于听觉场景分析的演示)
使用ISO/FDIS 226:2003进行听觉学
等响度曲线绘图
恒定元音颤音播放
部分重建“窗口和优劣”F. Harris比较表和窗口图
从以代码编写的“欢乐颂”的“乐谱”中播放/合成“欢乐颂”
所有录音/播放示例现在已准备,可使用默认API,也可接收“jack”或“alsa”等参数
实时STFT(短时傅里叶变换)效果
机器人化
在保持相位的同时“滚动”幅度谱
通用
tox用于测试CPython 2.7、CPython 3.2~3.6和PyPy
使用Travis CI和Coveralls进行持续集成
新的_internals.py模块,以避免在API中暴露包内部,同时允许新的简化__init__.py
更新setup.py,包括其内部(例如,使用AST代替字符串操作以避免在安装前导入包)和界面(例如,现在的test命令现在调用tox)
新的conftest.py用于测试来自StrategyDict实例内部策略的doctests,无需在模块中包含__test__,并跳过在Numpy不可用的情况下需要Numpy的已知的doctests
新的math目录,用于添加具有符号数学计算的脚本(使用Sympy),这些脚本用于设计(或作为证明)AudioLazy代码的部分。所有低通和高通策略都明确解释在那里
lazy_analysis
新的overlap_add StrategyDict实例,允许在块处理/分析后进行重合成,具有块大小自动检测和窗口归一化,以保持输出在[-1; 1]范围内。有两个实现,保持相同的接口
numpy(默认):需要内部Numpy数组
list:使用列表,不需要Numpy,并在PyPy上进行了测试
新的stft StrategyDict实例,允许通过以下方式实现短时傅里叶变换块处理器/相位声码器:
将函数作为第一个参数传递
使用stft策略作为装饰器
通过避免唯一的定位参数来创建新的策略
它是由三个基于Numpy的策略创建的
rfft、real或base(默认):需要内部numpy.fft.rfft以及其逆过程,以假设输入信号是实数,处理频域中的块并具有高达奈奎斯特频率的值
cfft 或 complex:与默认方法类似,但在频域中使用 numpy.fft.fft 对完整复数值块进行傅里叶变换,这意味着输出是复数信号
cfftr 或 complex_real:与 stft.cfft 策略相同,但只保留结果中的实部
参数允许更改默认的零相位行为(before 和 after 函数),变换和逆变换函数,重叠添加策略(以及其参数),以及显然的块大小和步长
现在 window StrategyDict 返回的是“周期”窗口数据,而不是用于直接与 STFT 一起使用的“对称”窗口
新增 wsymm StrategyDict,具有与 window 相同的策略,但返回的是“对称”窗口
默认的 window 策略是汉宁窗口(与 wsymm 相同)
为 window 和 wsymm 新增了 cos 策略,实现 alpha 次方的余弦函数
lazy_auditory
新增 phon2dB StrategyDict 实例,使用 ISO/FDIS 226:2003 模型从 phon 值获取 dB(声压级)
lazy_core
添加了对新 @ 矩阵乘法运算符的支持
OpMethod.get() 现在接受字符串 "1" 和 "2" 作为一元和二元查询运算符的数字,而 "all" 是新的默认值,因此 OpMethod.get(without="2 ~") 将获取所有运算符,但不是 [反转或不] 二元运算符和逆运算符,这意味着它只会产生一元运算符 "+"(正)和 -(负),正如可能预期的那样;OpMethod 还修复了有关位移运算符的错误
StrategyDict 策略名称自动补全现在在 IPython 上工作,因为 StrategyDict 现在更改其实例字典(例如 vars(window))而不是依赖于 __getattr__ 方法
StrategyDict 的 strategy 方法现在允许使用新的仅关键字参数 keep_name 保留策略函数名称。这可能会对添加内置函数以及其他不可变的可调用对象作为具有相同行为的策略的多名称策略(与添加策略的项目赋值相同)有所帮助
当 StrategyDict 实例的所有键/名称都被移除时,现在会删除其默认策略。新的默认值是下一个添加的策略
可以通过项目名称和属性来移除策略,移除不属于策略的属性会恢复具有该名称的策略属性
MultiKeyDict 方法 key2keys 和 value2keys 帮助获取指向相同值的所有键的元组,按插入顺序排序
lazy_filters
线性滤波器的系数现在可以是 Numpy 矩阵的流,也可以是 Sympy 符号(包括符号矩阵)。
新增简单的低通/高通 IIR 滤波器策略
highpass.z(作为新的 highpass 默认值)
lowpass.z
highpass.pole_exp
highpass.z_exp
lowpass.z_exp
其中,“z” 名称表示存在一个零(除了单个极点),“_exp” 表示从等效或镜像模拟滤波器方程(拉普拉斯变换)的匹配 Z-变换极值得到的指数近似。没有此类后缀表示它是直接作为数字滤波器设计的。
lazy_io
新增 AudioIO 的 api 关键字参数,允许例如与 JACK 集成(目前需要 chunks.size = 1)
AudioIO.open 和 AudioIO.record 现在允许直接传递给 PyAudio 的关键字参数,包括现在默认的 “channels” 关键字(旧的 “nchannels” 关键字仍然有效,为了向后兼容)
lazy_math
信号函数 sign 现在可以在 Python 3 中使用
lazy_misc
新增 cached 装饰器,用于缓存不带关键字参数的函数的结果
lazy_poly
复数和 Sympy 符号现在可以用作多项式的幂
多项式实例现在基于 OrderedDict(内部存储创建顺序)和 Poly.terms 现在支持 sort 和 reverse 关键字参数来选择产生顺序(按幂排序,保持创建顺序或反转这些顺序中的任何一个)
不可变多项式行为现在基于缓存的 frozenset(不依赖于项的顺序)并包括 Poly.zero 作为只读属性(在需要散列之后)
类似 Horner 的多项式评估方案(需要排序)现在可以通过关键字参数启用/禁用。默认情况下,它仅对简单多项式启用,但在幂可排序时(例如在 Laurent 多项式)是可选的
lazy_text
新增 format_docstring 装饰器,它使用格式化模板为函数分配文档字符串,旨在避免在 StrategyDict 实例上复制文档字符串。
lazy_wav (新!)
WavStream 类用于打开 Wave 文件。可以加载 24 位音频文件!已与 8 位文件(无符号整数)和 16/24/32 位(有符号整数)单声道和立体声文件进行测试,将数据强制转换为 [-1;1) 区间内的浮点数(默认值)并保留原始整数数据不变
多个模块
(lazy_math 和 lazy_stream)将元素级 abs 重命名为 absolute,因此在导入时使用 from audiolazy import * 从不替换 Python 内置名称。此外,内置的 abs 现在可以直接与 Stream 实例一起使用
(lazy_analysis 和 lazy_misc)将 freq2lag 和 lag2freq 重命名为使用 2 而不是 _to_,并将它们移动到 lazy_misc
版本 0.05 (Python 2 & 3,更多示例,重构,多项式)*
示例
使用 Tkinter GUI 通过零交叉率进行音高跟随器
使用 Stream 计算 Madhava-Gregory-Leibniz 级数和 Machin 公式中的 Pi
使用 DFT 的 LPC 绘图,显示两个共振峰(幅度峰值)
基于 Shepard “升高”音调的某个令人不安的示例
线性周期时变滤波器示例
现在巴赫合唱演奏者可以循环播放
新增基于 DFT 的音高跟随器(类似吉他调音器)和更好的 ZCR 基于音高跟随器,通过使用简单的限制器实现
将 SciPy 中的 Butterworth 滤波器作为 ZFilter 实例,并带有绘图
通用
现在测试的代码覆盖率达到了 82%
音频输出的模拟测试
修复错误(envelope.abs,midi2str,StreamTeeHub.blocks 等。)
通过使用 inf 和 nan 扩展了一些函数的定义域
移除了已弃用的 Stream.tee() 方法
常量 DEFAULT_CHUNK_SIZE 和 LATEX_PI_SYMBOL 已被移除:默认值现在可更改,分别在 chunks 和 float_str 中(有关更多详细信息,请参阅文档字符串)
Python 2.7 中 __div__ 和 __truediv__ 没有区别了。
现在 AudioLazy 支持 Python 3.2 和 3.3 了!
跳过依赖于特定 Python 版本的测试。
当依赖的包(例如 pyaudio)在测试环境中不可用时,使用 XFailer 类进行“xfail”测试。
lazy_compat (新功能!)
用于 Python 2.x 和 3.x 兼容性资源(常量和函数)的模块,不依赖 AudioLazy(即没有 Stream)
Python 2 和 3 中以“x”开头的基于可迭代版本的 itertools/built-ins 的通用位置:xmap、xfilter、xzip、xrange、xzip_longest。以“i”开头的版本保留在 lazy_itertools 模块中,以返回 Stream 实例(imap、izip、izip.longest 等),Python 2 中 range 的列表行为保留为 orange(一个富有成效的名字)
创建元类的新 meta 函数,始终以“Python 3 相似”的风格,保持语义(包括继承层次结构,将不会有任何额外的“虚拟”类)
lazy_core
新 OpMethod 类,包含 33 个操作方法实例和查询
将 AbstractOperatorOverloaderMeta 更改为基于 OpMethod 的新接口
现在 StrategyDict 更改了模块 __test__,以便策略的 doctests 可以被 doctest 查找器找到。
lazy_filters
ZFilter 实例现在为 Stream 系数和基于操作符的过滤器创建以及新的复制辅助方法做好了更好的准备
过滤器现在可以散列(例如,它们可以用在集合中)
lazy_io
新的 RecStream 类用于记录带有 stop 方法的 Stream 实例
现在 chunks 是这里的 StrategyDict,而不是两个 lazy_misc 函数
现在默认的块大小存储在 chunks.size 中,并且可以更改
lazy_itertools
来自 Python 3 的新 accumulate itertool,在 Python 2 中也可用,返回 Stream。这是一个新的 StrategyDict,在 Python 3 中有一个额外的策略
现在 chain.from_iterable 策略可用(Stream 版本 itertool),并且 chain 现在是 StrategyDict
现在 izip 是 StrategyDict,具有 izip.smallest(默认)和 izip.longest 策略
lazy_misc
新 rint 用于“四舍五入整数”操作以及其他更高步长的整数量化
现在 almost_eq 是一个单例 StrategyDict,具有 bits(默认,通过有效数字/尾数位比较)和 diff(绝对值差异)策略
lazy_poly
新 x 多项式对象(类似于 z ZFilter 实例)
Waring-Lagrange 多项式插值 StrategyDict
基于 Waring-Lagrange 插值器的通用重采样,适用于可变采样率
新方法 Poly.is_polynomial() 和 Poly.is_laurent()
新属性 Poly.order 用于常见多项式
现在 Poly.integrate() 和 Poly.diff() 方法返回 Poly 实例,并且调用者 Poly 中的 zero 总是保留在结果中(这包括许多错误修复)
Poly 实例现在为 Stream 系数和评估以及辅助方法 Poly.copy() 做好了更好的准备
Poly 现在可以散列并且有 __setitem__(不允许对同一实例同时使用两者)
lazy_stream
Stream.take 现在接受浮点数,因此,第一个 sHz 输出作为 s(表示第二个)时,现在可以直接使用 my_stream.take(20 * s),以及“获取全部”功能 my_stream.take(inf)
新增 Stream.peek() 方法,允许在保持它们作为 Stream 或 StreamTeeHub 下一个产生项的同时取出项
新增 Stream.skip() 方法,用于忽略前面的项而无需存储它们
新增 Stream.limit() 方法,用于强制执行最大“长度”
StreamTeeHub 的 skip()、limit()、append()、map() 和 filter() 方法返回修改后的副本作为一个 Stream 实例(即,类似于 Stream(my_stream_tee_hub).method_name())
在 tostream 中对模块名称的控制(对于 lazy_itertools 是必需的)
lazy_synth
ones()、zeros()、white_noise() 和 impulse() 中的输入“dur”现在可以是 inf(除了 None)
Impulse 现在有 one=1. 和 zero=0. 参数
新增 gauss_noise 用于正态/高斯分布的噪声
白噪声参数化限制
lazy_text(新功能!)
从 lazy_misc 获得所有文本/字符串格式化函数
命名空间清理:新的 StrategyDict float_str 将旧的 rational/pi/auto 格式化器包含在一个实例中
* 版本 0.04(文档、LPC、图表!)*
示例
随机巴赫合唱演奏示例(需要 Music21 语料库)
通用
Sphinx 文档!
在文档字符串中生成包和模块摘要
与 NumPy(在 1.5.0、1.6.1 和 1.6.2 上测试过)和 MatPlotLib(在 1.0.1 和 1.2.0 上测试过)集成
更多的文档字符串和 doctests,以及许多更正
项目化包描述、安装说明以及 README.rst 中的开始示例,包括图表
现在有 5400+ 个测试和 75% 的代码覆盖率
lazy_analysis
具有 lag “协方差”(由于 lpc.covar)的 acorr 和滞后的一维自相关函数
给定一个块进行任何频率的 DFT
三种包络滤波策略(时域)
三种移动平均滤波策略
信号裁剪函数
信号展开,默认为 2 * pi 弧度范围,但可配置为其他单位以及允许的最大信号差异
作为非线性滤波器的新 AMDF 算法
lazy_core
StrategyDict 实例现在是新类的一个单例,它具有基于其内容的懒加载非记忆化的文档字符串
lazy_filters
ZFilter 组合/替换,例如,(1 + z ** -1)(1 / z) 结果是 ZFilter 实例 1 + z
新增 LinearFilter.plot(),它直接将 LTI 滤波器的频率响应绘制到 MatPlotLib 图像中。可配置
线性(默认)或对数频率刻度
线性、平方或 dB(默认)幅度刻度
如果需要,可以一起绘制给定块的 DFT。对于 LPC 很有用
相位展开(默认为 True)
允许频率以 Hz 和弧度/样本为单位。当使用弧度单位时,刻度定位器基于 pi,以及格式化器
新增 LinearFilter.zplot(),可以直接将 LTI 滤波器的零极点平面绘制到 MatPlotLib 图像中
新增 LinearFilterProperties 只读属性 numpolyz 和 denpolyz,它们返回基于 x = z 的多项式,而不是基于 x = z ** -1 的多项式,后者由 numpoly 和 denpoly 返回
新增基于NumPy的线性滤波器属性 poles 和 zeros
新增用于滤波器分组的类 FilterList,具有 callables 属性,可以将具有恒定增益值的列表转换为滤波器。它是 FilterListMeta(旧CascadeFilterMeta)的实例,并且 CascadeFilter 现在继承自该 FilterList
将更多 LinearFilter 行为集成到 FilterList 中:绘图(plot 和 zplot)、poles、zeros、is_lti 和 is_causal
新增继承自 FilterList 的 ParallelFilter 类
现在 comb 也是一个 StrategyDict,包含 3 种策略
comb.fb(默认):反馈组合滤波器(IIR 或时间可变)
comb.tau:与反馈策略相同,但使用时间衰减参数 tau(以样本计的时间,直到 1/e 幅度,或 -8.686 dB)代替增益 alpha
comb.ff:前馈组合滤波器(FIR 或时间可变)
lazy_lpc(《新!》)
将线性预测编码(LPC)系数作为 ZFilter
lpc.autocor(《默认》):自动选择自相关实现(更快)
lpc.nautocor:自相关,通过 NumPy 解线性系统(更安全)
lpc.kautocor:自相关,使用 Levinson-Durbin 算法
lpc.covar 或 lpc.ncovar:协方差,通过 NumPy 解线性系统
lpc.kcovar:协方差,较慢。主要用于没有 NumPy 的情况
levinson_durbin:与 lpc.kautocor 相同,但输入是自相关向量,而不是信号数据
Toeplitz 矩阵作为列表的列表
偏相关系数(PARCOR)或反射系数
线谱频率(LSF)
带有 LSF 和 PARCOR 的滤波器稳定性测试器
lazy_math
新增 sign 获取给定序列的符号。
lazy_midi
完成频率(赫兹)、字符串和 MIDI 音高数值之间的转换器
新增 octaves 用于查找给定一个频率的频率范围内的所有八度
lazy_misc
新增 rational_formatter:将浮点数转换为字符串,可能带有符号字符串作为乘数
新增 pi_formatter:与 rational_formatter 相同,但将符号固定为 pi,主要用于 MatPlotLib 标签中
lazy_poly
新增基于 NumPy 的 Poly.roots 属性
lazy_stream
Streamix 类,用于根据起始时间差值混合流,自动管理多个“轨道”的需求
lazy_synth
Karplus-Strong 算法现在使用 tau 时间衰减常数代替组合滤波器的 alpha 增益。
版本 0.03(《时间可变滤波器、示例等.. 主要更改!》) *
examples(《新!》)
Gammaone 频率和冲激响应绘图示例
用于与 CPython 和 PyPy 基准测试的 FM 合成示例
简单的 I/O 线示例,将输入直接连接到输出
Modulo Counter 图形与 FM 合成音频在一个 wxPython 应用程序中的示例
窗口函数绘图示例(所有窗口策略)
通用
使用 __all__ 进行命名空间清理
大量优化和重构,包括测试和 setup.py
更好的文档字符串和 README.rst
Doctests(使用 pytest)和代码覆盖率(需要 pytest-cov)
现在有 5200+ 个测试和 79% 的代码覆盖率
lazy_analysis(《新!》)
新增 window StrategyDict 实例,具有
Hamming(《默认》)
Hann
矩形
Bartlett(三角形,两端为零)
三角形(不含零)
Blackman
lazy_auditory(《新!》)
两种 ERB(等效矩形带宽)模型(均为 Glasberg 和 Moore 所著)
用于从ERB找到任何伽玛调谐阶数的带宽函数
三种伽玛调谐滤波器实现:采样冲激响应、Slaney、Klapuri
lazy_core
MultiKeyDict:一种“可逆”字典(即值必须是可哈希的字典),可以为每个值有多个键
StrategyDict:可调用的字典,用于存储多个函数实现。继承自MultiKeyDict,因此同一策略可能有多个名称。它也可以遍历其值(函数)
lazy_filters
LTI和LTIFreq不再存在!它们已被重命名为LinearFilter和ZFilter,因为现在滤波器可以具有作为系数的Streams(它们不再需要是“时不变的”)
线性滤波器现在是可迭代的,允许
与almost_eq类似的比较,如assert almost_eq(filt1, filt2)
类似的表达式numerator_data, denominator_data = filt,其中每个数据都是一个可以用于Poly、LinearFilter或ZFilter输入的成对列表
LinearFilterProperties类,除了分子和分母外,还实现了numlist、denlist、numdict和dendict,来自numpoly和denpoly
比较“==”和“!=”现在是严格的
CascadeFilter:作为滤波器行为的过滤器列表
LinearFilter.__call__现在有“zero”可选参数(允许非浮点数)
LinearFilter.__call__的内存输入可以是一个函数或一个Stream
LinearFilter.linearize:线性插值延迟线来自分数延迟
反馈梳状滤波器
4个带2极点和指数逼近半径以带宽为半径的谐振器滤波器模型
简单的单极点低通和高通滤波器
lazy_io
AudioIO.record方法,从设备数据创建音频Stream实例
lazy_itertools
现在有一个更改后的tee函数,允许非可迭代输入,有助于使相同代码能够与Stream实例和常数一起工作
lazy_math(新功能!)
dB10、dB20函数将幅值(平方或线性,分别)转换为复数(如LinearFilter.freq_response返回的)的对数dB(功率)值
大多数来自math模块的函数,但用逐元素(sin、cos、sqrt等)装饰,以及常数e和pi
其他函数:factorial、ln(来自math的log)、log2、cexp(来自cmath的exp)和phase(来自cmath)
lazy_midi
MIDI音高数字和Hz频率转换器,如字符串“C#4”
lazy_misc
Elementwise装饰器现在基于参数关键字和位置
lazy_poly
类似Horner的Poly.__call__评估方案
现在Poly可以有Streams作为系数
比较“==”和“!=”现在是严格的
lazy_stream
可以直接使用Stream元素的属性和方法,逐元素,如my_stream.imag和my_stream.conjugate()在一个复数流中
新的thub()函数和StreamTeeHub类:tee(或“T”)枢纽自动复制器,帮助以几乎与您处理数字相同的方式处理Stream实例
lazy_synth
Karplus-Strong合成算法
ADSR包络
冲激、ones、zeros/zeroes和白色噪声Stream生成器
基于TableLookup类之外的高速正弦波
* 版本0.02(交互式Stream对象和查找表合成!)*
通用
10个新测试
lazy_midi(新功能!)
MIDI到频率(Hz)转换器
lazy_misc
sHz函数用于显式时间(s)和频率(Hz)单位转换
lazy_stream
使用ControlStream实例进行交互式处理
Stream类现在允许继承
lazy_synth(新功能!)
TableLookup类,带有正弦波和锯齿波实例
带模数的无限计数器,允许Stream输入,主要创建用于TableLookup实例
线、淡入、淡出、AD攻击带无限保持
版本 0.01(第一个“预alpha”版本!)*
通用
4786 个测试(包括参数化测试),基于 pytest
lazy_core
AbstractOperatorOverloaderMeta 类,用于帮助 Stream、Poly 和 LTIFreq(现在为 ZFilter)类大量重载操作符
lazy_filters
LTI 滤波器,具有操作符和导数的可调用对象,返回 Stream 实例
使用 z 对象的显式滤波器公式,例如 filt = 1 / (.5 + z ** -1)
lazy_io
基于 PyAudio 的多线程音频播放,具有上下文管理器接口
lazy_itertools
基于 Stream 的所有 itertools 版本
lazy_misc
基于块的加工,给定大小和(可选)跳数
简单的零填充生成器
函数的逐元素装饰器
基于位和差异的“几乎相等”比较函数,用于浮点数和包含浮点数的可迭代对象。还适用于(有限)生成器
lazy_poly
Poly:基于字典的多项式,具有列表接口和操作符
lazy_stream
Stream:每个实例基本上是一个具有逐元素操作符的生成器
装饰器 tostream,以便生成器函数可以返回 Stream 对象
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。