gpt4 book ai didi

python - 在 Python 中裁剪波形的顶部

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:47 27 4
gpt4 key购买 nike

我正在用 Python 生成要写入 WAV 文件的音调:

def generateTone(note):
# generates a sine wave in a note's frequency
tone = []
framerate = 44100
noteLookup = {'d':293.665,'a':440,'g':391.995}
frequency = noteLookup[note]
for i in range(framerate):
tone.append(math.sin(2.0*math.pi*float(frequency)*(float(i)/float(framerate))))
return tone

但是,如您所料,这些纯正弦波听起来不太悦耳。来 self understand ,“剪掉”这些正弦波的顶部,最好是留下平滑的角而不是突然切断的方式,将显着改善这些音调的声音。这是想法:

clipped waves
(来源:geofex.com)

话虽如此,我不知道该怎么做。

如何设置(最好以一种易于调整的方式)一个阈值,在该阈值上生成的正弦波将以如图所示的方式被平滑地削波?

最佳答案

最简单的方法是拥有一个引入“软裁剪”的映射 - 值是 1:1 线性直到它们接近阈值,然后被压缩直到它们达到某个更大的阈值。

编辑:这个想法很合理,但实现起来还有一些不足之处。我对它进行了更多思考,并用更好的东西取而代之。

目标是从压缩开始平滑过渡到硬限幅限制。线性变换的斜率为 1,削波信号的斜率为 0。从斜率为 1 过渡到斜率为 0 的最干净的方法是使用四分之一的正弦波,因此更新后的函数基于关于罪过

from math import *

hard_limit = 32767
linear_limit = 23197 # -3 dB
clip_limit = linear_limit + int(pi/2 * (hard_limit - linear_limit))

def soft_clip(n):
amplitude, sign = abs(n), 1 if n >= 0 else -1
if amplitude <= linear_limit:
return n
if amplitude >= clip_limit:
return hard_limit * sign
scale = hard_limit - linear_limit
compression = scale * sin(float(amplitude - linear_limit) / scale)
return (linear_limit + int(compression)) * sign

下面是一个在振幅为 40000 的正弦波上使用的示例,背景是未削波的版本。

Soft clipping demo

关于python - 在 Python 中裁剪波形的顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23284531/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com