数字失真效果算法

信息处理 声音的 算法 C 数字的 失真
2022-01-11 09:31:03

我在第 124-125 页阅读了 Udo Zölzer 关于失真效果的 DAFX 书,它说该函数给出了合适的失真模拟:

F(X)=X|X|(1-eX2/|X|)

有人可以解释这个公式以及我们得到什么样的信号吗?

据我了解,“x”是采样信号,所以这是一个数字序列。|x| 是什么意思?意思是?它是指每个采样值的 x 的绝对值吗?

所以如果我想实现这个失真效果的模拟,

  1. 我需要知道 x 的长度(由样本数给出)
  2. 在一个循环中,我需要为每个样本值计算这个公式
  3. 循环结束后,我得到失真的信号(以数字形式)

之后,我需要将其转换为模拟信号,这样我才能听到它。

3个回答

由于Olli Niemitalo 的回答中的情节,我确信书中给出的公式存在符号错误。用于模糊或失真的非线性总是某种类型的平滑削波函数,它压缩输入信号。因此,小输入幅度几乎没有变化,而高输入幅度(或多或少)被柔和地削波。而奥利的答案中显示的数字恰恰相反。

所以我相信正确的公式应该是

(1)F(X)=X|X|(1-e-X2/|X|)=sgn(X)(1-e-|X|)

对于小值X我们有F(X)sgn(X)|X|=X,对于大(幅度)值,我们得到F(X)sgn(X),即剪裁。

这是校正后的非线性图F(X)( WolframAlpha ):

在此处输入图像描述

公式也应该像最右边的表达式一样简化(1),因为初学者可能倾向于从字面上实现另一个公式并尝试评估这些术语X/|X|X2/|X|,这不必要地复杂,并且在以下情况下也会带来麻烦X接近于零。典型的实现如下所示:

如果 (x > 0)
   y = 1 - exp(-x);
别的
   y = -1 + exp(x);
结尾

|x| 表示绝对值 - x / |x| 公式的一部分是为了确保输入的符号保留在输出中。关于实施,是的,您列出的步骤是正确的。

您可以将函数体直接写入 Wolfram Alpha并绘制它:

在此处输入图像描述

对我来说,它看起来像一个整形器,可以按照你的描述使用。但是公式中有错误,请参阅@Matt L. 的答案