查看原文
科技

傅里叶级数及其在音乐分析上的应用(Python)

王海华 模型视角 2023-07-30


当你坐在钢琴前,轻轻敲击一个键,你听到的是什么?是一个单一的音符,清晰、纯净。但令人惊讶的是,这个简单的音符背后其实隐藏着一个丰富的频率世界。每一个音符,尽管在我们的耳朵里听起来是那么的单一和和谐,实际上都是由多个不同的频率成分叠加而成的。这种现象不仅存在于音乐中,它几乎无处不在,从夜晚的虫鸣到大自然的风声。为了解开这个秘密,法国数学家傅里叶发明了一种强大的数学工具——傅里叶级数。通过这个工具,我们可以深入探究音乐的内部结构,揭示那些看似简单的声音背后的复杂结构。让我们一起进入这个神奇的频率世界,探索音乐背后的数学魔法。

傅里叶级数

傅里叶级数 (Fourier Series) 是由法国数学家傅里叶(Jean-Baptiste Joseph Fourier)发明的。其主要思想是将周期函数表示为三角函数(正弦和余弦)的无穷级数。即使对于非周期函数,我们也可以通过扩展其定义域来将其视为周期函数。

对于周期为 的周期函数 ,其傅里叶级数表示为:

其中系数 定义为:

在音乐中的应用

傅里叶级数在音乐中的一个直接应用是分析音符的频率成分。每个音符,尽管听起来是单一的,实际上都是由多个不同频率的波组成的。这些不同的频率称为音符的"谐波"。基频是我们听到的主要音高,而其他的频率则是这个音高的倍数。

假设我们有一个音符的时域信号,并且想要分析其频率成分。我们可以使用傅里叶变换来达到这个目的,但为了简化,我们可以考虑使用傅里叶级数来近似这个音符,并查看其不同的频率成分。

下面我们先生成一个简单的音符信号,这个信号是由三个不同频率的正弦波组合而成的。这三个频率代表基频和其前两个谐波。然后我们使用傅里叶级数的定义,计算这个信号的频率成分。最后识别出音符的基频和谐波。

import numpy as np
import matplotlib.pyplot as plt

# 设置参数
fs = 44100  # 采样频率,这是一个常见的音频采样频率
T = 1.0    # 信号的总时间(秒)
t = np.linspace(0, T, int(T*fs), endpoint=False# 时域

# 基频
f0 = 440  # A4 音符的频率

# 生成信号,这是基频及其前两个谐波的组合
y = np.sin(2 * np.pi * f0 * t)           # 基频
y += 0.5 * np.sin(2 * np.pi * 2 * f0 * t)  # 第二个谐波
y += 0.3 * np.sin(2 * np.pi * 3 * f0 * t)  # 第三个谐波

# 绘制信号
plt.figure(figsize=(10,4))
plt.plot(t[:1000], y[:1000])  # 只显示前1000个点以便查看波形
plt.title('Generated Musical Note')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid(True)
plt.show()

# 返回生成的信号 y 和时间 t
y, t

如上图所示,我们生成了一个音乐音符,它是由基频 (A4音符) 及其前两个谐波组合而成的。这个信号在时域中看起来是一个复合波。

下一步,我们使用傅里叶级数的定义来计算这个信号的前几个频率成分。我们计算系数 ,并查看哪些系数是显著的,从而确定信号的频率成分。为了简化计算,我们将只计算前10个系数。

# 计算前10个Fourier系数
N = 10
a = np.zeros(N)
b = np.zeros(N)

for n in range(N):
    a[n] = (2/T) * np.trapz(y * np.cos(2 * np.pi * n * f0 * t), t)
    b[n] = (2/T) * np.trapz(y * np.sin(2 * np.pi * n * f0 * t), t)

# 绘制系数
plt.figure(figsize=(10,6))

plt.subplot(2,1,1)
plt.stem(range(N), a, use_line_collection=True)
plt.title('Cosine Coefficients $a_n$')
plt.grid(True)

plt.subplot(2,1,2)
plt.stem(range(N), b, use_line_collection=True)
plt.title('Sine Coefficients $b_n$')
plt.grid(True)

plt.tight_layout()
plt.show()

a, b

从图中可以看出:

  1. 余弦系数 的值非常小,接近于零。这意味着信号中余弦部分的贡献非常小。
  2. 正弦系数 的前三个值是最显著的,分别接近1、0.5和0.3。这与我们创建音符时使用的三 个正弦波的幅度相吻合。由此我们可以得出结论,该音乐音符主要由以下三个频率成分组成:
  3. 基频:
  4. 第二个谐波:
  5. 第三个谐波: 这与我们最初用于生成音符的频率完全相符。上述过程展示了傅里叶级数如何被用于分析音乐信号的频率成分。

分析音乐的成分起码有下述应用:

  • 通过分析一个音乐片段的频谱成分,了解它包含哪些频率和它们的强度,这对于音乐制作和混音非常有用。
  • 帮助识别和分类不同的音乐风格或者区分不同的乐器声音。
  • 数字音乐压缩:例如MP3格式,它利用了人耳对某些频率成分的不敏感性,去除了那些对音乐品质影响不大的频率成分,从而实现了音乐的压缩。

在音乐的每一个音符背后,都隐藏着一个神奇的频率世界,等待着我们去探索和理解。正如傅里叶级数为我们揭示了声音的复杂结构,每一个故事、每一个创意,都有其背后不为人知的深度和魅力。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存