1 Nyquist内置函数-其他行为函数
1.1 更多行为
- clip(sound, peak) [SAL]
(clip sound peak) [LISP]
硬限制声音到给定的峰值(一个正数)。sound
的样本被限制在peak
的上限值和-peak
的下限值之间。如果sound
是一个数字,clip
将返回该数字。如果sound
是一个多声道声音,clip
将返回一个多声道声音,其中每个声道都被限制在peak
范围内。结果的类型、采样率、起始时间等与sound
相同。注意:许多系统在将其转换为固定点音频(如16位样本)时会截断输出。相反,Nyquist 简单地取低阶16位,允许样本 “环绕” 。这听起来很糟糕,但关键在于:如果你的样本超出范围,你就会错过使用此函数进行硬输出的要点。警告:1.0 的浮点样本点映射到16位音频中的 (2^{15}),但16位样本的最大值是 (2^{15} - 1) !如果你的目标是将其限制在16位范围内,你应该将peak
设置为 (32767.0 / 32768.0) 。对于24位音频,使用 ((2^{23} - 1) / 2^{23}) 等。 - s-abs(sound) [SAL]
(s-abs sound) [LISP]
一个通用的绝对值函数。如果sound
是一个声音,计算每个样本的绝对值。如果sound
是一个数字,仅计算该数字的绝对值。如果sound
是一个多声道声音,返回一个对每个元素应用了s-abs
的多声道声音。结果的类型、采样率、起始时间等与sound
相同。 - s-avg(sound, blocksize, stepsize, operation) [SAL]
(s-avg sound blocksize stepsize operation) [LISP]
计算样本块的平均值或峰值。每个输出样本是输入声音中blocksize
(一个定点数)个相邻样本的平均值或峰值。在获取每个平均值或峰值后,输入会按stepsize
(一个定点数,可能大于或小于blocksize
)前进。输出采样率是sound
(输入)的采样率除以stepsize
。输出的持续时间(由于舍入,近似)与sound
相同。然而,请注意,输入的特征会在输出中通过半窗口大小进行平滑。例如,输入中的尖锐峰值会在输出中以半blocksize
进行平滑。你可以通过在平滑窗口之前插入s
来纠正这种偏移,例如(snd-avg (seq (s-rest (0.01), cue(s), 882, 441, OP-AVERAGE)) sound)
会将s
偏移0.01秒来补偿偏移。如果sound
是一个多声道声音,返回一个对每个元素应用了s-avg
的多声道声音。此函数对于计算低采样率的均方根(RMS)或峰值幅度信号以输入到snd-gate
或snd-follow
很有用。要选择操作,operation
应该是OP-AVERAGE
或OP-PEAK
之一(这些是全局Lisp变量;行为操作参数是一个整数)。有关RMS计算,请参见 “更多行为” 部分中的rms
。 - s-sqrt(sound) [SAL]
(s-sqrt sound) [LISP]
一个通用的平方根函数。如果sound
是一个声音,计算每个样本的平方根。如果sound
是一个数字,仅计算该数字的平方根。如果sound
是一个多声道声音,返回一个对每个元素应用了s-sqrt
的多声道声音。结果的类型、采样率、起始时间等与sound
相同。如果输入样本的平方小于零,对应的输出样本为零。这是因为负数的平方根是未定义的。 - s-exp(sound) [SAL]
(s-exp sound) [LISP]
一个通用的指数函数。如果sound
是一个声音,对每个样本 (x) 计算 (e^x) 。如果sound
是一个数字 (x),仅计算 (e^x) 。如果sound
是一个多声道声音,返回一个对每个元素应用了s-exp
的多声道声音。结果的类型、采样率、起始时间等与sound
相同。 - s-log(sound) [SAL]
(s-log sound) [LISP]
一个通用的自然对数函数。如果sound
是一个声音,对每个样本 (x) 计算 (\ln(x)) 。如果sound
是一个数字 (x),仅计算 (\ln(x)) 。如果sound
是一个多声道声音,返回一个对每个元素应用了s-log
的多声道声音。结果的类型、采样率、起始时间等与sound
相同。注意,(\ln(0)) 是未定义的(某些实现返回负无穷),所以请谨慎使用此函数。 - s-max(sound1, sound2) [SAL]
(s-max sound1 sound2) [LISP]
计算两个函数(sound1
和sound2
)的最大值。此函数也接受数字和多声道声音,并返回相应的数据类型。结果的起始时间是sound1
和sound2
起始时间中的最大值。结果的逻辑停止时间和物理停止时间分别是sound1
和sound2
的逻辑停止时间和物理停止时间中的最小值。因此,请注意,除了在两个输入声音的范围内,结果值为零。 - s-min(sound1, sound2) [SAL]
(s-min sound1 sound2) [LISP]
计算两个函数(sound1
和sound2
)的最小值。此函数也接受数字和多声道声音,并返回相应的数据类型。结果的起始时间是sound1
和sound2
起始时间中的最大值。结果的逻辑停止时间和物理停止时间分别是sound1
和sound2
的逻辑停止时间和物理停止时间中的最小值。因此,请注意,除了在两个输入声音的范围内,结果值为零。 - osc-note(pitch [, duration, env, loud, table]) [SAL]
(osc-note pitch [duration env loud table]) [LISP]
与osc
相同,但osc-note
会将结果乘以env
。env
可以是一个声音,或者是一个提供 ((t_1 t_2 t_4 l_1 l_2 l_3)) 的列表。结果的采样率为*sound-rate*
。 - quantize(sound, steps) [SAL]
(quantize sound steps) [LISP]
对声音进行量化,具体如下:将sound
乘以steps
并四舍五入到最接近的整数。然后将结果除以steps
。例如,如果steps
为127,那么范围从 -1 到 +1 的信号将被量化为255个级别(127个小于零,127个大于零,以及零本身)。这与Nyquist将信号写入8位音频文件时执行的量化匹配。sound
可以是多声道的。 - ramp([duration]) [SAL]
(ramp [duration]) [LISP]
返回一个在duration
(默认值为1 )内从0线性上升到1的斜坡函数。该函数实际上在duration
时达到1,因此会多一个样本,使总持续时间为duration + 1/*control-rate*
。有关更多详细信息,请参见图6 。ramp
不受*sustain*
变换的影响。时间扭曲的效果仅扭曲起始时间和结束时间。斜坡函数本身是未扭曲的(线性)。采样率为*control-rate*
。 - rms(sound [, rate, window-size]) [SAL]
(rms sound [rate window-size]) [LISP]
使用大小为window-size
的方形窗口计算sound
的均方根(RMS)。结果的采样率为rate
。rate
的默认值为100 Hz,默认窗口大小为1/rate
秒(转换为样本)。sound
可以是一个声音或一个多声道声音(在这种情况下,结果是一个多声道声音)。rate
是一个定点数,window-size
是一个定点数。 - recip(sound) [SAL]
(recip sound) [LISP]
一个通用的倒数函数。如果sound
是一个声音,对每个样本 (x) 计算 (1/x) 。如果sound
是一个数字 (x),仅计算 (1/x) 。如果sound
是一个多声道声音,返回一个对每个元素应用了recip
的多声道声音。结果的类型、采样率、起始时间等与sound
相同。注意,0的倒数是未定义的(某些实现返回无穷大),所以在处理声音时请谨慎使用此函数。声音的除法是通过乘以倒数来实现的。同样,请注意不要除以零。
图6:由 pwl
和 ramp
函数生成的斜坡
pwl
版本的斜坡朝着断点 ((1, 1)) 上升,但为了在断点 ((1, 0)) 处降回到零,该函数永远不会达到幅度1 。如果在一秒的构造开始时使用,下一个声音将在时间1开始。ramp
版本实际上会达到断点 ((1, 1)) ;注意它比 pwl
版本多一个样本。如果按顺序使用,下一个声音将在时间 (1 + P) 开始,其中 (P) 是样本周期。
- s-rest([duration]) [SAL]
(s-rest [duration]) [LISP]
以采样率*sound-rate*
创建给定持续时间(默认持续时间为1.0秒 )的静音(零样本)。根据*warp*
对声音进行时间变换。注意:rest
是一个Lisp函数,与cdr
等效。当你需要一个声音时,请小心使用s-rest
! - noise([duration]) [SAL]
(noise [duration]) [LISP]
生成具有给定持续时间(默认值为1.0 ,根据*warp*
进行变换 )的噪声。采样率为*sound-rate*
,幅度为 (\pm loud) 。 - yin(sound, minstep, maxstep, stepsize) [SAL]
(yin sound minstep maxstep stepsize) [LISP]
基本频率估计(音高检测)。使用YIN算法估计sound
(必须是一个声音 )的基本频率。minstep
(一个定点数)是考虑的最小频率(以音阶步数为单位),maxstep
(一个定点数)是考虑的最大频率(以音阶步数为单位),stepsize
(一个定点数)是期望的跳跃大小。结果是一个 “立体声” 信号,即由两个声音组成的数组,两者的采样率相同,这是sound
的采样率除以stepsize
。第一个声音由频率估计值组成(单位为音阶步数,即中央C = 60 )。第二个声音由表示频率估计置信度或可靠性的值组成。较小的值(小于0.1 )表示高度置信。较大的值表示较低的置信度。这个数字也可以被认为是在该时间点信号的非周期性功率。当数字较低时,它意味着信号在该时间点高度周期性,因此周期估计将是可靠的。提示1:请参阅Alain de Cheveigné和Hideki Kawahara在《美国声学学会杂志》2002年4月发表的文章 “YIN, A Fundamental Frequency Estimator for Speech and Music” 以获取有关Yin算法的详细信息。提示2:通常,stepsize
应该至少是一个周期内预期的样本数,以便在采样率远低于信号频率的情况下可靠地计算基本频率。为了优化速度,你可能希望使用低于44.1 kHz的采样率作为输入声音。Yin使用插值来实现潜在的分数样本幅度速率,所以更高的采样率不一定有助于算法,反而肯定会减慢速度。每次估计的计算时间为 (O(n^2)),其中 (n) 是考虑的最长周期内的样本数。因此,将minstep
除以12(一个八度)会使你获得4倍的加速,并且将sound
的采样率除以2(一个八度)会使你再获得4倍的加速。最后,估计的数量与stepsize
成反比。提示3:使用snd-rate
(见 “访问和创建声音” 部分 )获取估计的样本率。例如,(snd-rate (aref yin-output 0))
,其中yin-output
是yin
返回的结果,将是估计的样本率。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.