博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用c++设计音效插件 : 1介绍

Posted on 2022-06-16 13:19  pencilCool  阅读(422)  评论(0编辑  收藏  举报

翻译自: https://learning.oreilly.com/library/view/designing-audio-effect/9780429954313/xhtml/Ch01.xhtml#sec1_1

第一批负担得起的数字音频设备在80年代中期开始出现。数字信号处理(DSP)数学从1960年代起就已经出现了。商业数字录音首次出现在20世纪70年代初,但该技术直到15年后才开始广泛传播,当时光盘的出现开创了数字音频的时代。数字采样是指从一个连续的模拟信号中获取数据点。这些数据点在一个固定的时间间隔内被采样,称为 "采样周期 "或 "采样间隔"。采样周期的倒数是采样频率,我们把它表示为fs。一张光盘使用44,100赫兹的采样频率,每秒每通道产生44,100个离散样本,采样间隔约为22.7微秒(μS)。虽然数字采样适用于许多不同的系统,但本书只关注其中一种应用:音频。在20世纪90年代初之前,数字音频效果和合成器是在由微处理器、微控制器、DSP芯片和其他组件组成的硬件设备中实现的。这些设备一开始几乎都以模拟输入和输出连接为特色,后来开始加入数字I/O。数字音频工作站(DAW)出现在20世纪80年代末,音频软件开始盛行。微软发布了一个名为DirectX®的软件开发工具包(SDK),其目标是最初被称为多媒体的东西--当时很多人使用这个词,但很少有人真正理解。在DirectX中,有处理音频和视频数据流的信号处理规范,并在短时间内出现了第一个支持DirectX "插件 "的DAWs。大约在同一时间,斯坦伯格媒体技术公司发布了其虚拟工作室技术(VST)的规范,这可以说是有史以来最流行的插件格式。

在本书的学习过程中,你将同时学习DSP理论和C++软件应用。你可以立即接触到几十个C++对象,这些对象实现了书中的每一种信号处理算法,第9章到第22章将具体揭示算法向C++代码的转换。这些章节中的每一章都将包括一到三个这样的C++对象。这些对象不受任何插件格式或操作系统的约束。你可以很容易地将它们与其他信号处理对象或框架结合起来,而且你有许可证,可以按照你的意愿将它们用于商业或非商业插件。由此产生的产品听起来非常棒。当你开始发明你自己独特的插件,或实现最先进的音频算法时,你会得到极大的满足。

1.1 Using This Book

包括三个主要的商业化特效规格AAX(Avid Audio eXtension)、音频单元(AU)和VST3(Steinberg Media Technology GmbH)的单独章节。插件规范也被称为API。本书设计最重要的一点是,你可以在MacOS或Windows上,在你选择的DAW中使用任何你希望的平台来编写和测试你的插件。封装在上述C++对象中的DSP算法是平台和API中立的。当你学习API的具体章节时,你会了解到这三个API的内部功能确实非常相似,但不同的API的实现细节可能会让人不知所措。这导致了对第三方插件开发框架的使用。

你可能已经在使用这些框架之一了,比如JUCE--如果是这样,那就很好。你可以很容易地将C++信号处理对象纳入这些框架,因为这些对象不是以API或平台为中心的。请确保你遵守这些框架所要求的任何许可限制,并遵循他们的软件发布或代码公布规则。你将需要知道如何将音频输入和输出这些框架,以及如何设计你的图形用户界面(GUI)和处理来自GUI或DAW自动化的参数变化,所以请参考这些框架的文档以了解这些信息。

如果您和大多数读者一样,您可能还没有使用这些框架开发过插件,或者您尝试过,但被陡峭的学习曲线和新的实施细节所困扰,而这些框架本应有助于缓解这种情况。或者你可能已经下载了其中一个SDK,但对其内容感到困惑。这也没关系,因为我们在过去的三年里开发了一个功能齐全、真正专业、免许可的平台供你使用,这个平台叫ASPiK™(代表 "音频专用插件内核")。ASPiK由一组C++对象组成,这些对象是定制的,可以直接与AAX、AU和VST3插件对接,同时还有一个机制可以轻松生成新的插件项目。

本书中的项目被打包成ASPiK插件项目,如果你想使用其他第三方框架,可以简单地将其集成到这些框架中。本书中所有的插件项目都是以一种能够使代码简单地传送到其他开发系统的方式来编写的。此外,各个章节的代码并不关注任何API,也不关注ASPiK本身。本书的基本目标是帮助你理解音频信号处理算法,以及如何将它们转换为C++对象;它尽量做到平台、框架和API中立。

ASPiK框架中包括一个完整的、与平台无关的GUI设计系统,称为PluginGUI对象,它有一个拖放界面,可以在不写一行代码的情况下创建漂亮而专业的GUI。如果你想尝试GUI编程,你可以在第21章中了解自定义GUI设计的情况。

如果你是插件编程的新手,或者你想以最有效的方式开发新的插件或测试算法,你可能想使用RackAFX™软件,然而本书不是以RackAFX为中心,也不需要使用它。在ASPiK或其附带的对象中绝对没有RackAFX专用代码。然而,RackAFX简化了插件的编程和设计,允许你快速定义插件的参数和用户界面,它还包括测试你的插件算法的工具,如振荡器、示波器、频谱分析仪等。你也可以使用RackAFX在你的设计基础上生成ASPiK项目,这些ASPiK项目不依赖也不包括任何RackAFX专用的东西。你在本书中看到的几乎所有的实时响应图--包括频率、脉冲、阶跃和相位响应--都是用RackAFX的插件分析器完成的,它可以在插件运行时对其算法进行分析测量。

1.2 音频信号处理的基本原理

因为插件是硬件设计的软件变体,所以值得研究一下硬件系统是如何运作的:数据的采集、音频的重建以及音频信号的数字表示。然后我们定义我们的分析测试信号和基本的信号处理模块。

传入的模拟音频信号通过模数转换器(ADC或A/D)进行采样。模数转换器必须准确地对传入的信号进行采样和转换,产生一个有效的数字编码数字,代表采样区间内的模拟电压。这意味着,对于CD音频,转换器必须每22.7μS产生一个输出。图1.1a显示了带有低通滤波器、A/D和编码器的输入转换系统框图,而图1.1b展示了奈奎斯特频率的编码只由两点组成。

采样定理指出,一个连续的模拟信号可以被采样成离散的数据点,然后在不损失任何信息的情况下重建成原始的模拟信号--包括采样间的波动--当且仅当输入信号被带限,使其不包含高于采样率一半的频率,也被称为奈奎斯特频率或奈奎斯特速率。带限是指低通滤波(LPF)。在采样前对输入信号进行带限制被称为遵守奈奎斯特标准。

违反奈奎斯特标准将在信号中产生可听的错误,其形式是错误的编码信号。从现在开始,我们把奈奎斯特频率简单地称为 "奈奎斯特"。高于奈奎斯特的频率会折回到频谱中。这种效应被称为别名,因为高于奈奎斯特的频率被 "伪装 "成实际频率的 "别名 "进行编码。用图1.1c所示的别名信号的图片最容易解释这个问题,编码错误显示在虚线波形中--它显然不是正确的频率。

一旦产生了混叠信号,它就会作为一个永久的错误留在信号中。在输入端对信号进行频带限制的LPF被称为 "抗混叠滤波器"。另一种形式的混叠发生在电影中。一台模拟电影摄像机每秒拍摄30张照片(帧)。然而,它必须经常拍摄那些旋转速度远高于每秒30张的物体,如直升机叶片或汽车车轮。

image

图1.1:(a)一个模拟到数字的编码系统。(b) 奈奎斯特频率是每周期两个样本可以被编码的最高频率。(c) 将频率提高到奈奎斯特以上,但保持采样间隔不变,就会出现明显的编码错误--混叠信号(虚线)就是结果。

其结果在视觉上是混乱的:直升机叶片或汽车车轮似乎放慢了速度并停止,然后反方向加速,然后放慢并停止,反方向,等等。这是高频旋转的视觉结果,作为实际事件的错误编码回到电影中。

1.3 模拟信号的重构

数模转换器(DAC或D/A)首先对比特流进行解码,然后将采样的数据点或脉冲转换为这些脉冲的模拟版本。然后,DAC的输出被低通滤波,以产生最终的模拟输出信号,其中包括所有采样间的波动。与ADC图一样,解码器和D/A都在同一个设备(芯片)内。图1.2a显示了系统解码端的概念框图。输出滤波器被称为重建滤波器,负责重新创建原始采样操作没有获得的看似缺失的信息--所有采样间的波动。它工作的原因是,低通滤波将脉冲转换为模糊的、摇摆不定的版本。消失的版本具有f(x)=sin(x)/x的形状,这也被称为sinc()函数;它类似于图1.2b中的sombrero的轮廓。当一列脉冲被过滤后,产生的一组sin(x)/x脉冲会相互重叠,它们的响应会线性相加。所有较小的曲线和阻尼振荡的相加,重建了图1.2c中的样本间曲线和波动。

image

图1.2:(a)数字比特流被解码并转换成模拟输出,使用低通滤波器重构模拟信号。(b) 理想的重建滤波器产生一个具有阻尼振荡形状的模糊输出,而sin(x)/x形状的振幅与输入脉冲的振幅成正比。(c) LPF的sin(x)/x输出被相加,以重建原始的带限输入波形(样本间信息已经被重建)。

1.4 音频数据的数字表示法

音频数据可以用几种不同的方式进行数字编码。基本的数字音频理论表明,可用于编码的量化级别的数量是q = 2^N, 其中N是信号的比特深度。因此,一个8位系统可以编码2^8个值或256个量化级别。一个16位系统可以编码65,536个不同的值。图1.3a显示了编码音频数据的层次结构。作为一个硬件系统设计者,你必须首先决定你是要处理单极(无符号)还是双极(有符号)数据。之后,你需要决定数据类型。图1.3b显示了量化水平是如何编码的。虚线代表最小值和最大值。

单极或无符号数据的范围是0到+max,或-min到0,只有一个极性(+或-)的数据,加上数字0。
双极或有符号数据在-min到+max的范围内,是目前最常见的形式;它也包括数字0。
整数数据用整数表示,没有小数位;无符号整数音频在16位系统中从0到+65,535不等,而有符号整数音频在同样的16位音频中从-32,768到+32,767不等--这两种情况下,都有65,536个量化级别。
小数数据用整数和小数部分进行编码,合并为int.frac,用小数位来分隔各部分(如12.09)。
在小数数据子集中,有定点和浮点类型:定点数据固定了小数点两侧的有效数字,被组合为Int-Sig-Digits.Frac-Sig-Digits。例如,"8.16 "数据在小数点前有8位有效数字,在小数点后有16位有效数字。浮点数据有一个移动的尾数和指数,在IEEE预先确定的范围内编码数值。正数和负数部分用2的补码编码,因此正好相反的数值相加(如-0.5和+0.5)的结果总是零。
image

图1.3:(a)数字编码的层次结构。(b)几种不同类型的数据表示法的比较。浮点版固定在-1.0到+0.9999的范围内,尽管可以使用任何范围。

一个基本的问题是,量化水平的数量将总是一个偶数,因为2^N总是偶数。在双极系统中,我们非常希望将数字0编码为0。如果我们这样做,那么我们就用掉了一个量化级别。这就留下了一个不能完全分成两半的奇数级数。这就造成了你在图1.3b中看到的反常现象:对于双极编码来说,总是有更多的负(-)级量化水平比正级量化水平多。在单极情况下,没有一个值能完全编码零级;在图1.3b中,它在127和128这两个值的中间。

如果我们打算在算法中使用数字0,这种数据范围的轻微倾斜是不可避免的,而这几乎是可以保证的。在一些系统中,算法将负的音频数据限制在第二大负值。这是因为相位反转在处理算法中很常见,有的是故意的,有的是以负值系数或乘数的形式出现的。如果一个样本的值是-32,768,而它被反转了,那么就没有这个值的正值可以编码了。为了防止这种情况,-32,768的值被当作-32,767来处理。从音频硬件适配器(DSP和声卡)传输的音频数据以及存储在.wav文件中的音频数据通常是基于带符号的整数。然而,对于音频信号处理,我们更愿意使用浮点表示。幸运的是,大多数音频文件解码器都被设置为处理定点和浮点文件,并会自动为我们产生范围为[-1.0, +1.0]的浮点音频数据;注意,这简化了实际范围为-1.0至+0.9999。事实上,你在本书中编码的插件都会使用这个范围内的数据。原因与溢出有关。在音频算法中,加法和乘法都是很常见的。对于基于整数的数字,如果你在数学上将两个数字结合起来,导致一个超出已知数字范围的值,你会很快陷入麻烦。考虑一下-32,768至+32,767范围内的16位整数双极格式。当相乘时,这个范围内的大多数数值都会产生一个超出这些范围的乘积。加法和减法也会导致这种情况,但只适用于一半的可能值。然而,介于-1.0和+1.0之间的数字有一个有趣的特性,即它们的乘积总是在这个范围内的一个数字。在N位数字音频系统中,沿着-1.0到+1.0的归一化范围将一个整数值转换为一个分数值是很容易的,反向转换也是一样。

1.5 分析性DSP测试信号

你需要知道几个基本数字信号的数据序列,以便开始了解DSP理论的工作原理。我们将在第二章具体使用这些信号。基本信号集包括以下内容。

直流(DC)和步进(0 Hz)
奈奎斯特
½奈奎斯特
¼奈奎斯特
脉冲
这些信号中的前四个信号是你对一些基本的DSP滤波器的频率响应的大致了解,而且好消息是,所有的序列都很容易记住。下面的数字显示了x轴上标有x(n)的样本。在这些图中,n是样本数,从时间=0开始,n=0。

1.5.1 直流和步进(0 Hz)

image

图1.4: (a)直流/阶跃(0 Hz)的数字化分析测试信号;(b)fc=500 Hz的一阶低通滤波器的阶跃响应;(c)fc=1 kHz和Q=8的二阶低通滤波器的阶跃响应,以及(d)奈奎斯特、(e)½奈奎斯特和(f)¼奈奎斯特的数字化分析测试信号的图形表示。

直流或0赫兹和阶跃响应都可以通过直流/阶跃输入序列{...0,0,1,1,1,1,1,1...}找到,如图1.4a中所示。这个信号包含两部分:输入从0到1变化的步进部分和信号永远保持在1.0恒定水平的直流部分。当你把这个信号应用于你的DSP滤波器并检查输出时,你会得到两个信息;阶跃部分会告诉你瞬态攻击时间,而直流部分会给你直流或0Hz时的响应。图1.4b和1.4c显示了两个不同低通滤波器的阶跃响应。

1.5.2 奈奎斯特

奈奎斯特输入序列代表系统的奈奎斯特频率,与实际采样率无关。奈奎斯特序列是{...-1, +1, -1, +1, -1, +1, -1, +1 ...},如图1.4d所示。奈奎斯特频率信号是可以被编码的最高频率。它包含每个周期的两个样本的最小值,每个样本代表最大值和最小值。两个样本的最小值是说明奈奎斯特频率的另一种方式,因为它与采样定理有关。

1.5.3 ½奈奎斯特

图1.4e中的½奈奎斯特输入序列代表系统的½奈奎斯特频率,与实际采样率无关。信号的编码是每周期四个样本,是奈奎斯特的两倍。½奈奎斯特序列是{...-1, 0, +1, 0, -1, 0, +1, 0, -1, 0, +1, 0, -1, 0, +1, 0 ...}。

1.5.4 ¼奈奎斯特

图1.4f中的¼奈奎斯特输入序列代表系统的¼奈奎斯特频率,与实际采样率无关。它是以每周期八个样本进行编码的。¼奈奎斯特序列是{...0.0, 0.707, +1.0, 0.707, 0.0, -0.707, -1.0, -0.707, 0.0 ...}。

1.5.5 脉冲

图1.5a所示的脉冲信号由无限长的零流中的一个值为1.0的单一样本组成。DSP算法的脉冲响应(IR)是应用脉冲输入后的算法输出。脉冲序列是。{... 0, 0, 0, 0, 1, 0, 0, 0, 0, ...}. 数字算法的脉冲响应充分表征了行为系统,可以通过数学处理来产生频率和相位响应。图1.5b-f显示了我们将在插件中设计和使用的几个滤波器的脉冲响应。请注意,脉冲技术上是从样本n = 0开始的,所以轴被移到了事件的中心。图1.5b中的1024点有限脉冲响应(FIR)滤波器的IR显示,由于脉冲响应的参考框架被转移了512点,所以该滤波器引入了一个时间延迟。图1.5c-f中的脉冲响应来自另一种滤波器的设计:它们的脉冲响应被砸在Y轴上,因为它们没有像FIR版本那样引入大量的时间延迟。我们将在第11章和第16章详细讨论这些滤波器。

1.6 信号处理算法

在最广泛的意义上,算法是一组完成预定任务的指令。在音频信号处理的特殊情况下,算法是一组指令,对音频输入数据进行操作,产生音频输出比特流。对于实时处理来说,算法必须接受一个新的输入样本(或一组样本),进行处理,然后在下一个输入到来之前获得输出样本--如果处理时间过长,咔嚓声、啪啪声、刺耳声和噪音将成为实时结果。本书中的大多数练习都涉及处理输入的音频数据,并将其转化为处理后的输出。然而,将波形合成为输出也符合条件。在这种特殊情况下,没有实时音频输入需要处理。本书中的大多数插件都使用了效果器模型,即对输入的采样序列进行处理以创建一个输出序列,如图1.6a所示。在本书中,我将使用以下术语来表示输入、输出和脉冲响应信号。

x(n)总是输入序列;变量n代表x序列的第n个样本的位置。
y(n)总是输出序列;变量n代表y序列的第n个样本的位置。
h(n)是算法的脉冲响应,是一个特殊的序列,代表单样本输入或脉冲的算法输出。

image

图1.5:(a)由单个采样值1.0组成的脉冲信号;(b)1024点FIR低通滤波器,fc=1 kHz;(c)一阶低通滤波器,fc=100 Hz;(d)二阶高通滤波器,fc=500 Hz,Q=10;(e)二阶低通滤波器,fc=500 Hz,Q=0.2;(f)二阶低通滤波器,fc=500 Hz,Q=10。对于所有的脉冲响应,采样率fs = 44.1 kHz。

image

图1.6:(a)一个音频信号处理算法将输入的样本序列x(n)转换成输出序列y(n)。(b) 试图使用序列中每个样本的绝对位置是很困难的,因为样本索引号会很快增长得非常大。

1.6.1 簿记
你可以看到已经有三个序列来处理输入、输出和脉冲响应,所有这些序列都用同一个变量n来编码,以跟踪序列中样本的位置。第一步是决定如何使用n来完成这个记账的任务。用它来表示序列中的绝对位置会很快变得令人厌烦。你如何处理像x(12,354,233)这样的索引数字?图1.6b显示了一个输入信号,x(n)从t=0或x(0)开始。x(0)样本是进入信号处理算法的第一个样本。从整体上看,x(0)将是算法所知道的最古老的输入样本。

处理样本绝对位置的另一个问题是,算法在其编码中不使用样本的绝对位置。相反,算法使用当前输入样本的位置作为他们的参考框架,并使一切都与该样本相对。在下一个采样周期,一切都会根据(新的)当前输入样本再次进行重组。这听起来可能很混乱,但这是一种更好的跟踪样本的方法,更重要的是,定义了算法的输入/输出特性,称为传递函数。图1.7a显示了冻结在当前时间的输入信号;x(n)和其他样本的索引是基于它的位置。一个样本周期后,在图1.7b中,你可以看到参考框架已经向右移动,原来的x(n)现在变成了x(n-1)。

记账规则
当前的样本被标记为 "n"。
以前的样本是负的,所以x(n - 1)将是以前的输入样本。
未来的样本是正的,所以x(n + 1)将是相对于当前样本的下一个输入样本。
在下一个样本区间,所有的东西都被洗牌,并被引用到新的当前样本,x(n)。

1.6.2 一个样本的延迟
像音调控制这样的模拟处理电路使用电容和电感来改变模拟信号的相位和延迟,而数字算法则使用时间延迟。当你开始在你的信号处理结构中使用时间延迟块时,你会发现这个事实背后的数学和科学。在我们的算法图中,延迟用一个盒子表示,里面是字母z。z项会有一个指数,如z-5或z+2或z0;指数按照相同的记账规则对延迟的样本进行编码,负(-)指数代表时间上的延迟(过去的样本),正(+)代表时间上的延迟(未来的样本)。我们称z为延迟运算符,事实证明,它将被视为一种数学运算。

image

图1.7:(a)DSP算法使用当前样本位置作为参考位置。所有其他的样本都基于该样本进行索引,而输入序列在时间上被冻结在当前的输入样本x(n)。(b) 一个样本周期后,一切都发生了变化,以前的x(n)现在被索引为x(n - 1),而原来的下一个样本x(n + 1),现在变成了当前的输入样本x(n)。

你可能会问自己,你怎么能对未来有一个积极的延迟。答案是,对于实时信号处理来说,你无法做到。在实时处理中,你永远不知道下一个样本会到达哪里。然而,在非实时处理中(例如,一个你正在离线处理的音频文件),你确实知道未来的样本,因为它们就在文件中。图1.8a显示了在算法框图中表示一个样本延迟的两种常见方向。

延迟规则
每当一个样本进入延迟寄存器(内存位置),之前存储的样本就会被弹出。
被弹出的样本可用于处理或删除。
延迟元件可以级联在一起,一个元件的输出反馈给下一个元件的输入,以创造更多的延迟时间。
如果一个样本x(n)进入了一个样本的延迟元件,那么你怎么称呼被弹出的样本呢?它是之前进来的样本,是过去的一个样本区间。所以,输出的样本是x(n - 1),如图1.8b所示。在图1.8c和1.8d中,你可以看到延迟元件是如何级联的,在多个位置采取输出,产生多个样本用于算法中。

1.6.3 与一个标量值的乘法
下一个算法构建模块是标量乘法操作。它是一个逐个样本的操作,简单地将输入样本与一个系数相乘。乘法运算在几乎所有的DSP算法中都会用到。图1.8e显示了乘法运算符的作用。输出是输入的简单缩放版本。
image

图1.8:音频信号处理算法的常见框图组件包括以下内容。(a)两个方向的单样本延迟;(b)单样本延迟处理一个输入x(n)并延迟产生x(n - 1);(c)一个使用两个延迟产生两个延迟信号x(n - 1)和x(n - 2)的例子。(d) 使用两个延迟产生x(n - 1)和x(n - 2)的另一种方法;(e) 系数为a0和b1的标量乘法器块;以及(f) 求和和减法算法。

1.6.4 加法和减法
加法和减法实际上是同一种操作,因为减法是对一个负数的加法。有几种不同的算法符号来表示加法和减法。混合信号的操作实际上就是加法的数学操作。图1.8f以框图形式显示了加法和减法操作。请注意,减法运算用西格玛(Σ)符号表示,被减去的分支旁边有一个小(-)号。

1.6.5 一些算法实例和差分方程
按照惯例,DSP算法的输出序列被命名为y(n),将其与输入联系起来的数学方程被称为差分方程。差分方程不一定需要进行减法(差分)操作。它的名字对应于被称为差分方程的模拟等效版本。将这些操作结合起来,你会对差分方程的样子有一个更好的认识。图1.9a显示了算法构件的几种组合的差分方程。输出y(n)是输入的一个数学组合。

image

图1.9:(a)这些差分方程通过数学运算将输入与输出联系起来。(b) 一个简单的系数乘法器将处理三个基本的音频处理功能。(c) 一个通用的混频器/萨姆器,每行都有一个独立的系数(顶部),以及一个不会溢出或剪辑的归一化混频器(底部)。(d) 一个加权求和算法的例子(每个通道的每个样本都有自己的加权系数,a - d)。

1.6.5.1 增益、衰减和相位反转
如图1.9b所示,一个简单的系数乘法器将处理增益、衰减和反转这三个基本的音频处理功能。如果系数是一个负数,将产生相位反转的结果。如果系数的幅度小于1.0,就会发生衰减,而如果幅度大于1.0就会发生放大。请注意不同的符号,系数放在三角形的外面;这是另一种常用的指定方式。混合多通道数字音频的一个问题是有可能出现溢出或产生超出系统范围的采样值。你看到,通过将双极分数系统限制在-1.0到+1.0的范围内,这些数字中的任何一个的乘法结果总是比其中一个小,而且总是在[-1.0, +1.0]的同一范围内。然而,信号的加法很容易产生±1限制以外的数值。为了绕过这个问题,N通道混合电路加入了衰减器以减少输入的大小,其中衰减值为1/N。当混合两个通道时,每个衰减器的值为二分之一,而三通道混频器的每个混合分支上的衰减器的值为三分之一。如果所有通道碰巧在同一采样时间有一个最大值或最小值,它们的和或差仍将被限制在[-1.0, +1.0]的范围内。图1.9c和1.9d显示了广义的混合算法和加权和算法。

在下一章中,你将从软件的角度介绍一个插件的解剖。在以后的章节中,你将学习DSP理论如何让你把这些构件组合成滤波器、效果器和振荡器,用于你自己的插件中。

1.7 一阶前馈和反馈算法

我们将从两个常见的结构开始DSP的学习过程,这两个结构被称为前馈和反馈。它们的名字与结构中的信号流有关,每一个最基本的设计都有一个延迟寄存器,一个夏天,和两个系数标量乘法器。图1.10a显示了前馈结构;输入被分成当前输入x(n)和延迟输入x(n - 1)信号路径。每条路径都有一个系数a0和a1加权;当前输出y(n)是这两条路径的简单相加。图1.10b显示了反馈版本。请注意,它有一个相同的,用a0加权的当前输入前馈分支和一个反馈路径,在延迟一个样本形成y(n-1)后回收输出y(n);这个延迟的输出路径用-b1加权并与输入路径相加。在b1系数前面加一个负号的原因将在后面变得很明显。结构的顺序与信号路径中延迟元素的数量有关;这些都是一阶结构。

image

1.8 Bibliography

Ballou, G., ed. 1987. Handbook for Sound Engineers. Carmel, IN: Howard W. Sams & Co., 1987, pp. 898–906.

IEEE 754–2008 Standard for Floating-Point Arithmetic. 2008. New York: Institute of Electrical and Electronics Engineers. http://www.dsc.ufcg.edu.br/~cnum/modulos/Modulo2/IEEE754_2008.pdf

Jurgens, R. K., ed. 1997. Digital Consumer Electronics Handbook, Chap. 2. New York: McGraw-Hill.

Kirk, R. and Hunt, A. 1999. Digital Sound Processing for Music and Multimedia, Chap. 1. Burlington, MA: Focal Press.

KORG Wavestation SR Service Manual. Tokyo, Japan: KORG, Inc.

Limberis, A. and Bryan, J. 1993. An Architecture for a Multiple Digital-Signal Processor Based Music Synthesizer with Dynamic Voice Allocation, Journal of the Audio Engineering Society, Convention Paper 3699, Audio Engineering Society, 95th Convention, October, San Francisco, CA.

Pohlmann, K. C. 2011. Principles of Digital Audio. New York: McGraw-Hill, pp. 16–30.

Stearns, S. D. and Hush, D. R. 1990. Digital Signal Analysis, Eaglewood Cliffs, NJ: Prentice-Hall, pp. 44–52.