我正在用 Python 实现阴算法,以便在吹口哨或哼唱时提取我的声音音高。我的目标是产生可以输入到模拟合成器的 Gate(包络控制)和 CV(音高控制)信号。我还想编写一个将这些信号作为输入的软件合成器。这样我就可以用我的声音播放合成器了。
下面最上面的图是我吹了几个音符时 YIN 算法的输出:
然后我用低通滤波器对其进行整理,以在第二张图中产生信号。最后,也许是天真地,我产生了如下第三个信号:
from scipy.io.wavfile import write
sr = 16000 # sample rate
f = [518.8087307738297, 518.9079938888592, 518.9177212823167, 519.8298830180304, 522.3027794382949, 523.8695096842832, 524.859458031283, 525.4703986196301, 525.4431662533539, 525.6859351990167, 525.6523745060124, 525.9697551477367, ...]
out = [math.cos(2*math.pi*f[i]*(i/sr)) for i in range(len(f))]
换句话说:
cos(2 pi f t)
其中 f(t) 是第二个图中的信号。我希望这会产生一个类似于我以恒定幅度放置的口哨录音的信号。然而,我得到了一个非常欢快的声音信号,根本没有让我想起我的原始录音。如果我将图表中的第一个信号用作 f(t),那么当我将其应用于 cos(2 pi ft) 时会产生噪声。我在这里有什么误解?这是来自样本 20000 到 30000 的信号。如果我有瞬时频率,我应该如何重现一个让人想起原始录音的信号?

