【问题标题】:Generate a sliding tone using Python使用 Python 生成滑动音
【发布时间】:2017-03-12 02:21:20
【问题描述】:

我有兴趣在 Python 中生成一个基于变量改变频率的注释。我希望这个音符听起来尽可能“流畅”,而我在声音合成领域几乎没有经验。

我想要一个波(最初是正弦波,尽管如果有人有一个通用的解决方案会很好)实时响应频率变量。我知道许多解决方案会导致声音出现一些不连续性,即每次频率变化时都会产生新的正弦音;我想尽可能避免这种情况,尤其是因为我预计频率会发生很大变化。

(如果有什么不同,我计划使用实时频率输入,即来自滑块并根据此输入播放声音。)

我使用的是 Linux 设备(特别是 Raspberry Pi 1 型号 B。)

【问题讨论】:

  • 了解您所说的效果称为频率调制可能会有所帮助。您可能会发现this page 很有用。
  • 如果你在 Windows 上,你应该查看 winsound 模块。
  • @Trak 不幸的是,我打算在 Linux 上执行此操作。我将编辑问题。

标签: python audio


【解决方案1】:

您所说的效果称为频率调制。这是调频广播和调频合成的基础。 This page 更详细地显示了您需要做什么,但为了回顾基础知识,您需要根据以下公式生成输出:

y = sin(2π⋅fc⋅t + β⋅sin(2π⋅fm⋅t))

其中 fc 是载波频率,fm 是调制频率。您可以使用 β 来表示调制的“量”。

以下代码将使用 220 Hz 调制信号调制 440 Hz 载波信号:

import numpy


fs = 44100 # sampling frequency, Hz
fc = 440  # carrier frequency, Hz
fm = 220  # modulation frequency, Hz

T = 0.5 # seconds
twopi = 2*numpy.pi

t = numpy.linspace(0, T, int(T*fs), endpoint=False) # time variable

# Produce ramp from 0 to 1
beta = numpy.linspace(0, 1, int(T*fs))


output = numpy.sin(twopi*fc*t + beta*numpy.sin(twopi*fm*t))

输出声音是一个完全不同的故事。如果您使用的是 Jupyter 笔记本,这将起到聆听声音的作用:

from IPython.display import Audio
Audio(output, rate=fs)

【讨论】:

  • 有时链接会死掉,这使得该解决方案的未来可读性首屈一指。您应该在答案中插入来自网站的更多信息(例如,仅通过阅读您的答案而不是查看链接,我不明白如何使用该等式。)您可以使用链接作为支持,但包括所有相关答案中的信息。
  • 不使用jupyter还有其他选择吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多