🥥Python音乐信号处理和理论可视化
Python | 音乐信号 | 数学 | Numpy | scipy | Matplotlib | 傅里叶变换
音乐信号处理 | 声音定义
如何发出声音? 您可以鼓掌,敲门或唱歌以发出声音,所有这些动作都会引起某种形式的振动。 振动以波的形式通过介质(空气,水等)传播到我们的耳朵中。 但是,我们无法听到所有振动,因为某些频率不在我们的听觉范围内。 我们将较高的频率视为较高的音调,并且不同的音符具有不同的频率。 下面显示了C调和D调的声波。
如您所见,D波完成一个周期所花费的时间更少,因此具有更高的频率。
Python造音
为了使声音具有特定的音调,我们需要知道频率。 维基百科上有一张很棒的表,可将钢琴上的琴键映射到频率。 通常,如果我们使用C调上方的A的频率为440Hz(备受争议的音乐会音高)的约定,则可以使用以下公式得出任何音符:
其中n是键的等级(A4是第49个键)。
这篇文章有很棒的示例代码,说明如何计算音符频率并产生声波。这里的代码非常相似,只是扩展到88个键,而不是一个八度:
上面的函数返回一个字典,该字典将音符名称映射到相应的频率(以赫兹为单位)。现在,我们要C调中间波:
这里的持续时间以秒为单位,采样率决定声音的质量,振幅决定音量。消费类音频非常常见的采样率为44.1KHz(每秒44,100个采样)。
使用上面的两个函数以及Scipy的wavfile模块,我们可以创建一个中音C调的.wav文件。
这是输出音频。
逼真声音
至少可以说,上面的音频很无聊,没有一个合适的人会认为它是音乐。 它缺乏将乐器的声音与之关联的许多特征,而且在整个过程中都过于一致。 首先,我们将其与实际钢琴上演奏的中音C调进行比较。
由于音色(音质或特性),同一音符在钢琴上的演奏与在小提琴上的演奏有所不同。 当我们按下钢琴上的琴键时,它不仅会发出一种声音(或一种波形),还会产生我们称为泛音(谐波)的许多其他声音。 不同的乐器会产生不同的泛音,因此会产生音色,即使在演奏相同音符的情况下,我们也可以将一种乐器与另一种乐器区分开。
再次使用Scipy,我们将加载钢琴音频并使用Matplotlib绘制声波。
即使它们应该具有相同的音调,这看起来也完全不像第一部分中的纯正弦波!它不是那么平滑,并且幅度会发生变化。
由于存在泛音,该波不是“平滑的”。 上面的声波实际上是频率为中音C的倍数(包括音符本身,包括1)的波的组合。在这种情况下,中音C是我们的基本音符。 这些泛音是什么? 结果表明,高于(C5)一个八度的C频率恰好是中C频率的两倍,因此这是我们的候选者之一。 实际上,所有C的频率都是彼此的倍数。 但是,当我们按下中间的C键时,听起来并不像我们同时按下所有C键。 这是因为泛音比基本音要模糊得多。 为了模仿钢琴的声音,我们将需要知道如何将这些泛音应用到基础上。
将信号中不同频率的信号与一个输入信号(我们的声波是信号的离散版本)分开的一种信号处理常用技术是傅立叶变换。现在,仅将其视为可让我们按频率对声波进行分类的操作。 我们将在钢琴音频上应用快速傅立叶变换(FFT)并绘制频谱图。
频谱图显示了略高于250Hz的最高峰值(我们最突出的信号)。 这是有道理的,因为中间C的频率约为261.65Hz。 下一个频率刚好高于500Hz(C5的频率约为〜523.25Hz),依此类推。 它们的间隔也均匀,这与我之前所说的泛音频率是基本频率的倍数相符。
下面的代码段计算了钢琴采样中每个泛音与基音之间的幅度比,以便我们可以将其应用于纯正弦波。
现在,我们将这些比率应用于基本注释及其泛音。
我们离得很近,但是声音在整个过程中仍然太一致(音量保持不变)。 当我们按下实际的钢琴键时,它开始亮起,然后迅速变大,并且声音随着时间而减弱。 描述声音如何变化的一种模型是ADSR(攻击,衰减,维持和释放)。 从本质上讲,它描述了声音经历了四个阶段:倾斜的初始阶段,然后下降到较低的水平,在那里保持一会儿,然后逐渐减小到零。 ADSR对某些工具的建模要优于其他工具,但在我们的案例中应该足够了。 以下是我采用指数权重实现ADSR的效果,以实现更平滑,更逼真的声音。 当然,您可以根据需要使用简单的线性权重。
来自同一乐器的声音在不同房间中会发生变化,因此ADSR阶段可能会有所不同。 此外,如果我们知道声音如何在音乐厅中弹跳,理论上讲,我们可以将其建模并应用到剪辑中,使其听起来就像我们在音乐厅中弹钢琴一样。 更正式地说,当我们播放声音时,给定位置中特定的声学特性称为脉冲响应(IRF),如果我们将IRF与输入声波进行卷积,就可以得到输出声音,就像我们在所述位置中播放一样。
整合
现在,我们将泛音和ADSR权重应用于上面产生的纯正弦波。
源代码
理论可视化
我将探讨为什么我们将某些声音与甜美和淡淡联系在一起,而另一些却使我们感到紧张。我还将在上述的合成钢琴中添加延音踏板,以使其听起来更逼真。
谐音与不谐音
不完美的谐音
不谐音
延音踏板
源代码
Last updated