如何在浮点信号上添加奇数或偶数谐波?

我是否必须使用tanh或sin?

我想做的就是获得一些简单的失真效果,但是我很难找到确切的参考。我想要的是与“文化秃鹰”所做的类似的工作,在其五极管和三极管设置中添加了奇数和偶数谐波。浮点值是样本流中的单个样本。

评论

为什么要添加谐波?您想要完成什么?您正在处理哪种信号?

我正在尝试实现一些非常简单的失真效果,但是我很难找到确切的参考。我想要的是与文化秃鹰类似的东西,它在五极管和三极管设置中添加了奇数和偶数谐波,浮点值是样本流中的单个样本。

@CarlosBarbosa您应该从问题的注释中编辑该信息。提供详细信息-问题对于社区而言越有趣,您可以期望得到的答案就越多,质量也就越高。

为什么奇数谐波比电力系统的偶数谐波更具危险性

#1 楼

失真框的作用是对信号应用非线性传递函数:output = function(input)y = f(x)。您只需将相同的功能应用于每个单独的输入样本即可获得相应的输出样本。

当您的输入信号为正弦波时,会产生一种特定类型的失真,称为谐波失真。失真产生的所有新音调都是输入信号的完美谐波:


如果传递函数具有奇对称性(可以绕原点旋转180°),则它将仅产生奇次谐波(1f,3f,5f等)。一个具有奇数对称性的系统的示例是对称钳位放大器。
如果您的传递函数具有偶数个对称性(可以在Y轴上反映出来),那么产生的谐波只会是偶次谐波(0f, 2f,4f,6f,...)基波1f是一个奇次谐波,被去除。具有均匀对称性的系统的一个示例是全波整流器。

因此,是的,如果要添加奇次谐波,请通过奇对称传递函数(例如y = tanh(x)y = x^3)放置信号。 br />
如果只想添加偶次谐波,请通过偶数对称的传递函数加上一个恒等函数来放置信号,以保持原始的基本特性。诸如y = x + x^4y = x + abs(x)之类的东西。 x +保留了本来会被破坏的基波,而x^4是偶数对称的,并且仅产生偶次谐波(包括DC,您可能希望随后通过高通滤波器将其消除)。

偶数对称:

偶数传递函数:



原始信号为灰色,蓝色为失真信号,并且显示失真的频谱仅偶次谐波且无基波:



奇数对称性:

奇对称传递函数:



原始信号为灰色,失真的信号为蓝色,失真的频谱仅显示奇次谐波,包括基波:


<对称性+基波:
<具有偶数对称性的传递函数加上标识函数:



原始信号为灰色,蓝色的信号失真,并且失真的信号频谱显示偶次谐波加基波:



人们在谈论失真盒“增加了奇次谐波”时谈论的是这个话题,但这并不准确。问题在于谐波失真仅存在于正弦波输入中。大多数人演奏乐器而不是正弦波,因此他们的输入信号具有多个正弦波分量。在这种情况下,您将得到互调失真,而不是谐波失真,并且关于奇数和偶数谐波的这些规则不再适用。例如,对以下信号应用全波整流器(偶数对称):


正弦波(仅基本奇次谐波)→全波整流正弦波(仅偶次谐波)<方波(仅奇次谐波)→直流(仅偶次谐波)
锯齿波(奇次和偶数谐波)→三角波(仅奇次谐波)
因此,输出频谱在很大程度上取决于输入信号,而不是失真设备,并且只要有人说“我们的放大器/效果会产生更音乐的偶次谐波” “,则应将其与一粒盐一起食用。

(声称具有偶数谐波的声音比仅具有奇次谐波的声音“更具音乐性”,这是有道理的,但是如上所述,实际上并未在此处产生这些频谱,并且该主张仅在以下情况下有效:无论如何,西方音阶都如此。在Bohlen–Pierce音乐音阶上,奇异和声(方波,单簧管等)更协和,基于3:1的比例,而不是2:1的八度音阶。) >要记住的另一件事是,数字非线性过程会导致混叠,这可能很难听到。请参阅是否存在带限非线性失真之类的东西?

评论


$ \ begingroup $
请注意,此处的示例函数使数学易于理解,但通常不用于音频方面。例如,对于x ^ 7,您增加增益的幅度越大,信号失真就越小。
$ \ endgroup $
– Endolith
18年9月12日在21:50

#2 楼

您试图实现的目标称为失真。当您要向给定信号添加一些谐波时使用此技术。您有2种基本的方法可以做到这一点:波动和振铃调制。我将首先解释一下。

波形整形

波形整形可让您通过专门使用所选功能。 Chebyshev多项式是一种有用的方法。
当通过它们归档具有单位幅度的谐波信号(例如正弦波)时,它们具有非常重要的性质,我们获得的信号相同,只是高了几倍。倍频将取决于多项式的阶数。所有多项式看起来都像这样:

$$
\ y = f(x)= d_0 + d_1x + d_2x ^ 2 + d_3x ^ 3 +…+ d_Nx ^ N;
$$

在我们的例子中,每个元素生成一个口琴,然后它们全部加起来。每个成员的视图由以下递归关系确定:

$$
T_ {k + 1}(x)= 2xT_k(x)– T_ {k–1}(x) ;
$$

其中的每个成员都是根据前一个成员确定的,所有成员均以0开头(在我们的情况下为1),第一个为等于x(但您当然可以更改)
$$
T_0(x)= 1;
$$

$$
T_1 (x)= x;
$$

知道它们,就可以确定第三和第四位:
$$
T_2(x)= 2x * x – 1 = 2x ^ 2 – 1;
$$

$$
T_3(x)= 2x(2x ^ 2 – 1)– x = 4x ^ 3 – 3x;
$$$

您可能会猜到,第二个术语-第一个谐波,第三个谐波-第二个谐波,依此类推。

Chebyshev的另一个功能多项式,当通过它们给出振幅小于单位的信号时,输出的谐波声音饱和度较小。毕竟,您的信号是一个浮点数组,您可以选择数组的任何部分,然后将其应用于Chebyshev多项式,这将产生更多的谐波。使用$ sin $函数就足够了。

评论


$ \ begingroup $
好的答案,在这里学到了一些东西。但是,我不同意您对术语传递函数的使用。它的共同定义是频域上线性时不变系统的输出与输入的关系。您的系统是非线性的。我宁愿称其为特征或仅在此处起作用。
$ \ endgroup $
–戴夫
2012年11月11日14:44

$ \ begingroup $
@Deve谢谢。是的,确实我使用了不正确的术语,只是功能足够好。我当时想写线性系统的例子,但是它很简单,所以我一直想着这个术语。
$ \ endgroup $
– sigrlami
2012年11月11日15:02

$ \ begingroup $
哇,谢谢,尽管如此,我仍会阅读很多东西,是否有机会获得一些示例C代码?再次感谢
$ \ endgroup $
–卡洛斯·巴尔博萨(Carlos Barbosa)
2012年11月11日23:09

$ \ begingroup $
您能否详细说明$ T_0(x)$,$ T_1(x)$等的方程与$ y $的原始方程有什么关系?...
$ \ endgroup $
–太空
2012年11月11日23:22



$ \ begingroup $
@Mohammad它们并不完全相关,如果主题启动器不知道,这只是多项式函数的简单描述。
$ \ endgroup $
– sigrlami
2012年11月12日11:50