PyTorch Audio 教程:使用加法合成技术生成波形

PyTorch Audio 教程:使用加法合成技术生成波形

audio Data manipulation and transformation for audio signal processing, powered by PyTorch audio 项目地址: https://gitcode.com/gh_mirrors/au/audio

引言

在音频信号处理领域,合成技术是创造各种音色的重要手段。本教程将重点介绍如何使用 PyTorch Audio 的 DSP 功能实现加法合成(Additive Synthesis)技术。加法合成通过组合多个基本波形来创造复杂的音色,是数字音频合成中最基础也最直观的方法之一。

技术背景

加法合成原理

加法合成的核心思想是傅里叶理论——任何周期性波形都可以表示为一系列正弦波的叠加。通过控制这些正弦波的频率、振幅和相位关系,我们可以创造出各种不同的音色特征。

PyTorch Audio 的 DSP 功能

PyTorch Audio 提供了一套强大的数字信号处理原型功能,包括:

  1. oscillator_bank:生成多种波形(正弦波、方波等)
  2. adsr_envelope:创建 ADSR 包络(攻击、衰减、保持、释放)
  3. extend_pitch:扩展基频以创建谐波或非谐波部分

准备工作

首先需要设置基本参数和辅助函数:

import torch
import torchaudio
from torchaudio.prototype.functional import adsr_envelope, extend_pitch, oscillator_bank
import matplotlib.pyplot as plt

# 基本参数
PI = torch.pi
PI2 = 2 * torch.pi
F0 = 344.0  # 基频(Hz)
DURATION = 1.1  # 持续时间(秒)
SAMPLE_RATE = 16000  # 采样率(Hz)
NUM_FRAMES = int(DURATION * SAMPLE_RATE)

谐波合成

锯齿波合成

锯齿波包含所有整数倍谐波,其数学表示为:

y_t = \sum_{k=1}^{K} -\frac{(-1)^k}{kπ} \sin(2πkf_0t)

实现代码:

def sawtooth_wave(freq0, amp0, num_pitches, sample_rate):
    freq = extend_pitch(freq0, num_pitches)
    mults = [-((-1)**i)/(PI*i) for i in range(1, 1+num_pitches)]
    amp = extend_pitch(amp0, mults)
    return oscillator_bank(freq, amp, sample_rate=sample_rate)

方波合成

方波仅包含奇次谐波:

y_t = \sum_{k=0}^{K-1} \frac{4}{(2k+1)π} \sin(2π(2k+1)f_0t)

实现代码:

def square_wave(freq0, amp0, num_pitches, sample_rate):
    freq_mults = [2.0*i + 1.0 for i in range(num_pitches)]
    amp_mults = [4/(PI*(2.0*i + 1.0)) for i in range(num_pitches)]
    freq = extend_pitch(freq0, freq_mults)
    amp = extend_pitch(amp0, amp_mults)
    return oscillator_bank(freq, amp, sample_rate=sample_rate)

三角波合成

三角波同样只包含奇次谐波,但振幅衰减更快:

y_t = \sum_{k=0}^{K-1} (-1)^k \frac{8}{((2k+1)π)^2} \sin(2π(2k+1)f_0t)

非谐波合成

真实乐器音色往往包含非整数倍谐波。以钟声为例:

# 钟声参数
num_tones = 9
mults = [0.56, 0.92, 1.19, 1.71, 2, 2.74, 3.0, 3.76, 4.07]  # 非整数倍频

freq = extend_pitch(freq0, mults)
amp = adsr_envelope(
    num_frames=num_frames,
    attack=0.002,
    decay=0.998,
    sustain=0.0,
    release=0.0,
    n_decay=2
)
amp = torch.stack([amp * (0.5**i) for i in range(num_tones)], dim=-1)

waveform = oscillator_bank(freq, amp, sample_rate=SAMPLE_RATE)

可视化与分析

教程提供了 plot() 函数来可视化生成的波形和频谱特性,包括:

  • 振荡器频率变化
  • 振幅包络
  • 波形时域图
  • 频谱图

应用建议

  1. 音乐合成:组合不同波形创造丰富音色
  2. 声音设计:通过调整谐波结构模拟真实乐器
  3. 音频研究:作为理解声音构成的工具

总结

PyTorch Audio 的 DSP 功能为音频合成提供了强大而灵活的工具。通过本教程,我们学习了如何使用加法合成技术生成各种基础波形和复杂音色。这些技术可以进一步扩展,结合滤波器和其他效果处理,创造出更加丰富的音频体验。

对于想要深入音频合成的开发者,建议尝试:

  • 混合不同波形类型
  • 实验非标准谐波结构
  • 结合包络调制创造动态音色变化

audio Data manipulation and transformation for audio signal processing, powered by PyTorch audio 项目地址: https://gitcode.com/gh_mirrors/au/audio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧爱颖Kelvin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值