Nyquist内置函数-其他行为函数

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-gatesnd-follow 很有用。要选择操作,operation 应该是 OP-AVERAGEOP-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]
    计算两个函数(sound1sound2 )的最大值。此函数也接受数字和多声道声音,并返回相应的数据类型。结果的起始时间是 sound1sound2 起始时间中的最大值。结果的逻辑停止时间和物理停止时间分别是 sound1sound2 的逻辑停止时间和物理停止时间中的最小值。因此,请注意,除了在两个输入声音的范围内,结果值为零。
  • s-min(sound1, sound2) [SAL]
    (s-min sound1 sound2) [LISP]
    计算两个函数(sound1sound2 )的最小值。此函数也接受数字和多声道声音,并返回相应的数据类型。结果的起始时间是 sound1sound2 起始时间中的最大值。结果的逻辑停止时间和物理停止时间分别是 sound1sound2 的逻辑停止时间和物理停止时间中的最小值。因此,请注意,除了在两个输入声音的范围内,结果值为零。
  • osc-note(pitch [, duration, env, loud, table]) [SAL]
    (osc-note pitch [duration env loud table]) [LISP]
    osc 相同,但 osc-note 会将结果乘以 envenv 可以是一个声音,或者是一个提供 ((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)。结果的采样率为 raterate 的默认值为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:由 pwlramp 函数生成的斜坡

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-outputyin 返回的结果,将是估计的样本率。

作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值