数字声音处理教程

2020-11-10 18:23:02

1998年,我在其他人准备高中期末考试的时候有了一些额外的时间,进入了数字信号处理领域。我是按照我所学的方式写的,结果是这样的。它在某些方面并不完全准确,但可以作为了解音频DSP世界的很好的教程。以前这份文件被称为耶哈尔的数字声音处理教程的脑筋急转弯,但我已经长大了几年,我的场景身份。享受ASCII艺术!

这是为音频数字信号处理发烧友(如标题所示)和其他需要该主题实用信息的人编写的。如果你没有这方面的线性阅读经验,并且遇到了困难,看看前面几章有没有什么可以帮你的。

在滤波器频率响应图中,使用线性频率和幅度尺度。换页功能专为60多行/页打印机设计。

《洗牌方程式》一章是我哥哥卡勒写的。同时,感谢蒂莫·托萨瓦宁分享他的数字信号处理器知识!

采样的声音数据是一堆样本,即取自实际声波的幅值。采样率是拍摄镜头的频率。例如,如果频率为44100,则在1秒内已采集了44100个样本。

_0-0_ _/--0__ 0_0-0__0-0-0_ \__-0--0--0-__ +---0==-+--=0---+---0==-+-。--+ -0-0_ --0 <;->; 1/采样率。

原始声音是曲线,而‘s’是采样点。水平直线是零水准。

采样声音只能表示采样率的一半以下的频率。这就是奈奎斯特频率。一个简单的证明是:每个波浪周期需要至少存储两个采样点,即波浪的顶部和底部,以便稍后能够重建它:

0\/0\/0\/0\/0\/0\/0\/0\/0\ | +-|-。+ | \0/\0/\0/\0/\0/\0/\0/\0/\0。

如果您尝试在采样声音中包含高于奈奎斯特频率的频率,您得到的只是额外的失真,因为它们显示为较低的频率。

声音由频率成分组成。它们看起来都和正弦波一模一样,但它们的频率、相位和振幅不同。让我们来看看一个频率:

_ /\/\ /-\ \__/\__/ 我想说的是。

现在,我们从另一个声音中提取相同的频率,并注意到它具有相同的振幅,但相位相反(旋转180度)。

_ /\/\ \-/ \__/\__/ 我想说的是。

合并两个信号只需将它们相加即可。如果我们对这两个正弦波执行相同的操作,结果将是:

它就会安静下来。如果我们考虑其他情况,在相位差小于180度的情况下,我们得到的正弦波都具有不同的幅度和相位,但频率相同。

下面是计算产生的正弦波的相位和振幅的方法。将振幅和相位转换为一个复数,其中角度是相位,绝对值是振幅。

如果你对这两个弦波都这样做,你可以把它们加在一起作为复数。

(A波)幅度1,相位0,(B波)幅度1,90度阶段 _-|-__-0-__-|-0 /|\/|\/|\ | -|-+-0-+-|-|--=--| | \_|_/\_|。_/\_|_/ -|。

如您所见,新正弦波的相位为45度,振幅SQRT(1^2+1^2)=SQRT(2)=约1.4。

理解这一点非常重要,因为在许多情况下,将频率的振幅和相位表示为复数更为实用。

当把两个采样的声音加在一起时,你实际上可能会抹去一些频率,那些具有相反相位和相等幅度的频率。产生的声音的平均振幅是(对于独立的原声)SQRT(a^2+b^2),其中a和b是原始信号的振幅。

滤波器的主要用途是缩放声音中频率分量的幅度。例如,低通滤波器会将截止频率以上的所有频率分量静音,换句话说,就是将幅度乘以0。它让所有低于截止频率的频率不受衰减地通过。

如果你通过驱动不同频率的正弦波来研究低通滤波器的性能,并测量放大器,你就会得到幅值频率响应。下面是一个低通滤波器的幅频响应曲线曲线图:

1-+ \\ Audible|听不到 || || \_ 0-+--== || 0 HZ最大截止频率。

频率在轴上,放大在轴上。如你所见,低于截止频率的频率的放大倍数是1。因此,它们的幅度不会受到任何影响。但是高于截止频率的频率的幅度被乘以零,所以它们就消失了。

过滤器从来不会给声音添加任何新的频率成分。他们只能调整已经存在的频率的幅度。例如,如果你有一个完全安静的样品,你不能通过过滤得到任何声音。此外,如果你有一个正弦波样本,并对其进行滤波,结果仍然是相同的正弦波,只是幅度和相位可能不同--不会出现其他频率。

专业人士不厌其烦地提醒我们,不要忘记阶段是多么重要。声音中的频率分量有它们的振幅和……。阶段。如果我们取一个正弦波和一个余弦波,我们看到它们看起来很相似,但是它们的相位差是π/2,一个完整周期的四分之一。而且,当你播放它们的时候,它们听起来很像。但是,试着戴上耳机,在左声道播放正弦波,在右声道播放余弦波。现在你听到区别了吧!

相位本身并不包含重要的信息,所以我们听不到它,但是两只耳朵之间的频率的相位差可以用来估计声音来源的位置,这样它就可以被听到了。

滤波器有幅度频率响应,但也有相位频率响应。下面是一个可能来自低通滤波器的曲线示例:

+pi-+---+ _ _-\ 0-+=-|-= |\_--。--| 我想说的是 -pi-+---+ || 0 HZ最大截止频率。

如果过滤声音,来自相位频率响应的值将被加到原始声音的频率的相位上。

线性(直线)相位与普通延迟是一样的,尽管它在情节中可能看起来很疯狂,如果它绕几圈的话。例如,如果你的低通滤波器没有线性相位频率响应,你不能通过简单地以相等的延迟从原始输出中减去它的输出来将其变成高通滤波器。

滤波器对单个频率的响应可以表示为复数,其中角度是滤波器的相位响应,绝对值是幅值响应。当您将过滤器应用于声音时,实际上是将声音中的所有频率分量与相应的过滤器响应值进行复数乘法。(如果你觉得这很难理解,请阅读《把两条弦波加在一起》一章。)。例如:在1000赫兹时,滤波器的响应为(0,1)。您可以过滤一个正弦波,其相位和幅值信息显示为与其频率相同的复数(0,1):

正弦波:过滤器:结果: _-0-__-0-_-|-_ /|\/|\/|\ | -||-+-|--*-|-+-|--=-0 | \_。|_/\_|_/\_|_/ -|。

正弦波的相位旋转了90度。振幅没有变化。

串联的这两个滤波器的组合响应是A的响应乘以B的响应(复数总是!)。如果你只需要知道震级响应,你也可以乘以绝对值。

在图中,这两个过滤器的输入来自相同的来源。然后将它们的输出加在一起,形成最终输出。现在,您需要使用加法来求解组合响应。

FIR滤波器更直观,更容易理解。有限脉冲响应是指当滤波器输入保持为零一段时间后,滤波器输出也变为零。无限脉冲响应滤波器在关闭输入后永远不会完全稳定下来,但它确实会变得越来越安静。

这个过滤器对声音的影响取决于系数(a0,a1,a2)。选择系数值是最困难的部分,我们稍后会讨论这一点。要设计自己的过滤器,您需要了解背后的一些数学知识,并知道正确的方法。

在上面的筛选器示例中,只使用过去的输入值。在实时过滤器中,这是一个要求,因为你不知道未来的输入。在样例编辑器之类的地方,您没有这个限制,因为您在开始时就已经准备好了全部输入数据。

与FIR滤波器不同,IIR滤波器还使用其先前的输出值来创建其当前输出。下面是一个简单的例子:

可以有多种方法来实现相同的IIR滤波器。有些可能比通常的输入-输出-系数方式更快。无论如何,每个IIR滤波器都可以用这种形式编写,并且必须在滤波器设计和检查计算中使用。

在样本数据中,IIR滤波器的脉冲响应(=滤波器对一个采样点脉冲的响应)通常大致如下所示:

一些设计糟糕的IIR滤光片是不稳定的。这会导致输出的声音越来越大,而不是越来越安静。一个简单的例子是:Output(T)=Input(T)+2*Output(t-1)。一旦它获得输入数据,它就会变得疯狂。

上述过滤器类型逐个样本地处理数据。如果你使用快速傅立叶变换(FFT)来实现你的滤波器,情况就不是这样了。FFT通常操作长度为2^n的块。首先,你应该准备好你计划的滤波器脉冲响应。然后,使用FFT将其转换为频谱信息,即代表频率分量的相位和幅度的复数。这些分量被称为桶,因为它们的频率是固定且均匀分布的,如果原始数据包含任何中间频率,那么这种频率的大部分能量将分布在附近的桶中。现在,您还需要对要过滤的样本数据进行快速傅立叶变换,并将得到的频率段与过滤器中的频率段相乘。然后使用IFFT(逆FFT)将信息转换成经过滤波的样本数据块。

因此,两个频域数据的相乘导致了两个时域数据的卷积。然而,这里有一个问题:FFT对周期信号进行操作,也就是说,如果你有一个与FFT块一样长的滤波器脉冲响应,那么FFT块中间的任何非零样本数据都将产生卷积,使滤波器的尾部绕过FFT边界。为了避免这个问题,您可以使用两倍于滤波器脉冲响应时间的FFT,并且在对采样数据执行FFT时,只需将FFT输入缓冲器填满一半,并将其余输入设置为零。对于较长的输入,您可以像这样处理块中的数据,然后将得到的过滤后的块相加在一起。这称为重叠添加方法。另一个选项是重叠保存(如果你愿意的话可以查一下)。

无论出于何种原因,FFT也可以用来分析样本数据的频率成分。如果你只取一大块样本数据,它有尖锐的边缘,这对FFT不利。我们使用窗口函数来平滑这些边缘。升余弦,cos(x pi/2)^2是一个可能的窗口函数。下面您将看到当您将窗口函数应用于一大块样本数据时会发生什么:

示例数据块:窗口函数:结果: (方波)(升余弦) 1-|-||_-_||_--| ||/\| ||_/\_||\_ 0-||*|-|=|--_--| |\ |\_/ -1-|-|--。

有时(重新采样,精确定义的延迟),您需要从已知采样点之间获取采样值。这就是你需要插补的时候。如果你不插补,只是扔掉样本偏移量的小数部分,你就会得到很多高频失真:

0-0-0-0 ||| 0-0-0-0 ||| 0-0-0-0。

在本例中,原始采样点尝试表示正弦波。插补曲线越接近正弦波,插补算法越好。最简单的插补方法是线性插补。在两个相邻采样点之间绘制直线:

0__0-0__0 -__--__- 0__0 0__0 -__--__- 0-0 0-0。

它看起来仍然是一个非常前卫的正弦波。然而,对非插值的改进是显著的。这也有一个缺点--略低于奈奎斯特频率的频率会受到衰减,甚至比没有插补的情况下还要严重。这里是线性插值的公式:new=old(Int)+(old(int+1)-old(Int))*FRACT,其中int表示样本偏移量的整数部分,FRACT表示小数部分。

下一步可能是Hermite曲线,它在各个方面都比线性插值提供更好的质量:

___ 0_-0 0-_0 __ 0__0 0__0 _ -0_0--0__0-

使用线性插值法,你需要一次知道2个采样点才能画出这条线。对于Hermite曲线,其数值为4。插值曲线穿过两个中间点,1点和4点用于曲线的整形。公式是立方的:

NEW=a*FRACT^3+b*FRACT^2+c*FRACT+old(int+0),在哪里: 3(old(Int)-old(int+1))-old(int-1)+old(int+2) A=--- 2个 5旧(整型)+旧(整型+2) B=2旧(int+1)+旧(int-1)。 2个 旧(int+1)-旧(int-1) C= 2个。

F(X)=ax^3+bx^2+cx+d /f(0)=y(0) | |f(1)=y(1) <; |f';(0)=(y(1)-y(-1))/2 | \F';(1)=(y(2)-y(0))/2。

一个完美的插值法也是存在的。通过用正确缩放的sinc曲线sin(Pi X)/(Pi X)替换所有采样点,并将它们相加,就可以得到精确、完美的插值。以下是用缩放的正弦曲线替换的采样点之一:

_--0--_0 0_/\_ _/\_ _/\_-__ -/-+-\-/-\-/= \_/\_/。-- -0-0 0。

正弦曲线是无限长的,所以你必须使用所有的采样点来计算一个插值值。一个实际的解决方案是将样本数量限制在1000个以内。对于实时应用程序来说,它仍然太慢了,但它会提供很高的精确度。如果您坚持在实时插值算法中使用sinc,请尝试使用窗口函数和较少的sinc曲线(至少6条)。

如果要下采样(降低采样率),必须首先过滤掉上述奈奎斯特频率,否则它们将在下采样的样本中显示为失真。

在滤波器设计过程中,往往需要做出妥协。要在幅值响应中具有锐利的边缘或陡峭的斜坡,您将需要一个大的、因此速度较慢的滤镜。换言之,抽头数较少的滤光器实际上总是具有平缓倾斜的幅度响应。

在IIR滤波器的情况下,幅度的尖锐边缘通常意味着丑陋(非常非线性)的相位频率响应,而接近线性的相位响应意味着幅度响应的平缓倾斜。使用FIR滤波器,试图创建非常锐利的边缘可能会导致附近频率的幅度波动。

IIR滤波器非常适合实时程序,因为它们速度快,它们的特性(例如截止频率)可以在动作过程中快速改变,而且它们听起来像真正的模拟滤波器。:)IIR滤光片的非线性相位响应通常无关紧要。

FIR滤波器可以在质量和线性相位很重要的地方使用,例如,在样本编辑器中。对声音以外的其他信号进行滤波的人往往希望获得线性相频响应。

对于立体声信号,在左声道和右声道上具有相同的相位变化是很重要的。

低通行证: __________________ |_ 海帕斯: __________________ _ 带通或峰值: _ _||_ 开槽,带阻或带阻: _ _ 所有通行证: _(仅限相变)。

如果你有一个符号计算程序,我强烈建议你在机械计算中使用它,只是为了让你的生活更容易。派生是一个旧的DOS程序,但仍然非常有用。

白噪声指的是频谱平坦的那种噪声。通过使用随机数作为样本值,可以很容易地创建它。如果你想知道滤波器的幅频响应,把它应用到白噪声的长样本上,然后对输出进行频谱分析。你看到的是滤波器的幅频响应。

另一种方式是发送一个样本脉冲,该脉冲最初具有平坦的频谱。在样本数据中,脉冲看起来是这样的:0,0,0,0,1,0,0,0,0-其中脉冲是中间的";1";。

两者相比,脉冲处理速度更快,但使用白噪声可以得到看起来更干净的结果,因为错误将不那么明显。出于大致相同的原因,当你在看视频时,静止的图片看起来会比运行的图片看起来更多的雪。对长样本进行光谱分析通常是将其分成小块,分别进行分析,然后取所有分析的平均值。在这里,我个人选择的是Windows版的Cool Edited96。

零极点方法是设计快速、简单的IIR滤波器的最简单的方法。当你学会了它,你就能自己设计过滤器了。

PI/2";|";轴:虚数 __-|-_";-";轴:实数 _/|\_(一如既往!) /|\ || PI-|-+-|-0 || \_|_/ \__|__/ -| 3/2圆周。

想象一下围绕单位圆包裹的频率。在角度0,我们有0赫兹,在pi/2我们有采样率/4,在pi我们有采样率/2,奈奎斯特频率。你不应该关心更高的频率,因为它们永远不会出现在信号中,但不管怎样,在2pi(完整周期),我们有采样频率。

因此,如果使用44100赫兹的采样频率,0赫兹将在(1,0)处,11025赫兹在(0,1)处,22050赫兹在(-1,0)处。

__-|-__o x=极 _/o|\_o=零 /|x\ |x -|-o-+-|-- |x \_|x_/ \__o|__/ -|-o。

有些规则你必须记住。杆子必须始终在单位圆的内部,不能在单位圆的外面或上面。零可以放在任何地方。您可以使用任意数量的极点和零点,但如果它们不位于";-";轴上,则它们必须都有共轭对。共轭对意味着,例如,如果您将一个零设置为(0.6,0.3),则必须将另一个零设置为共轭坐标(0.6,-0.3)。杆子也是如此。

极点放大频率,零点衰减。

.