这是我第一次处理音频,我正在尝试连接任意(数据驱动)频率的正弦曲线,并且无法消除由正弦之间的不连续性引起的咔嗒声。
我正在阅读this thread使频率成为相位的函数,以便线性增加波的频率,但无法弄清楚如何使其适应任意移动的频率。
我正在计算与前一个正弦曲线的相移,然后尝试相应地移动下一个正弦曲线,但这似乎只是使声音变得更高音调,并且没有消除咔嗒声。
def audio_map(data):
p=[]
phase = 0
for point in data:
if point[0]<0:
f=100*np.abs(point[0])
else:
f=100*point[0]
#Do something with the phase to shift the sinusoid below???
p=np.concatenate((p,np.sin((4*np.pi*f/sampling_rate)*np.arange(sampling_rate*np.pi/(16)))))
phase=f*np.pi/16
return p
感谢您的帮助!!
最佳答案
编辑
我对您选择的正弦函数也有点困惑,它看起来系数或持续时间与现实世界的值无关,我希望看到这样的东西:
p = np.concatenate((p, np.sin((2 * np.pi * f / sampling_rate) * np.arange(total_tone_time * sampling_rate) + phase)))
phase += 2 * np.pi * f * total_tone_time
phase %= 2 * np.pi # strip off full cycles to avoid overflow
哪里
- total_tone_time 是当前播放音调的持续时间
- sampling_rate 以 Hz(每秒样本数)为单位测量
在每项之间添加相位的目的是保持生成的复合曲线连续,这可能有助于避免波形中出现任何爆音。如果您听不到任何声音,请确保输出的频率在可听范围内:http://en.wikipedia.org/wiki/Audio_frequency
在尝试下面讨论的内容之前,我会先尝试上面的建议,这些建议会深入兔子洞。
/编辑
不是专家,但我认为您所说的关于导致点击的不连续性的说法可能是正确的。如果是这样,您可以在连接处进行幅度的快速淡出/淡入以避免点击。
这是我能想到的其他一些可能性。
型号和版型
您如何对频率进行采样?它们是否在特定时间进行采样,以便您可以获得作为时间函数的频率?如果是这样,您可以尝试将曲线拟合到这些点(这是一个不平凡的问题),然后取计算曲线积分的正弦:
Sin[2 * PI * 积分[频率(时间), 时间, 0, current_time]]
数值积分
作为拟合曲线的替代方法,如果您的频率采样率足够快以近似平滑曲线,则可以直接在数值积分中使用这些值。对于下面的示例,我假设您的数据采用 [[freq0, time0], [freq1, time1], ...] 的格式,并且频率样本随着时间的推移以您想要的相同速率均匀分布对输出波形进行采样。
PI = 3.14159
waveform = [0] * len(data)
phase = 0
time_delta = data[1][1] - data[0][1]
for i, (f, t) in enumerate(data):
if i != 0:
phase += 0.5 * (f + last_f) * time_delta
waveform[i] = sin(2 * PI * phase)
last_f = f
phase %= 2 * PI
请注意,对于上述内容,我使用的是梯形方法,如下所述:http://www.mathworks.com/help/matlab/ref/trapz.html#bua4lsr
关于此方法,我担心的一件事是您正在获取频率的绝对值,这对我来说意味着您的频率可能不是从产生良好行为的连续函数的数据源中采样的。
添加坡道
最后,如果您要连接来自没有直接时间依赖性的随机样本的频率,则可以添加频率斜坡来弥补差距。
你可以尝试线性:
sin(PI * [(f2 - f1) / time_frame * t ** 2 + 2 * f1 * t])
或指数:
sin(2 * PI * time_frame * f1 * exp(log(f2 / f1) * t / time_frame) / log(f2 / f1))
哪里
- time_frame 是您希望斜坡持续的持续时间
- t 选择从零开始并在 time_frame 结束
- f1 是离开的频率
- f2 是输入的频率
关于python - 连接不同频率的正弦曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28102789/