我正在自己玩一些起始/节拍检测算法。我的输入是一个 .wav 文件,我的输出是一个 .wav 文件;我可以访问 float[] 数组块中的整个波形。
我很难想出一个调试和评估我的算法的好方法。由于我的输入和输出都是听觉的,我认为如果我的调试工具也是听觉的,例如,那将是最有意义的。通过在起始点向 .wav 文件添加可听见的“滴答声”或“哔哔声”。
有人对如何做到这一点有任何想法吗?理想情况下,这将是一个简单的 for 循环,我会运行几百或几千个样本。
我正在自己玩一些起始/节拍检测算法。我的输入是一个 .wav 文件,我的输出是一个 .wav 文件;我可以访问 float[] 数组块中的整个波形。
我很难想出一个调试和评估我的算法的好方法。由于我的输入和输出都是听觉的,我认为如果我的调试工具也是听觉的,例如,那将是最有意义的。通过在起始点向 .wav 文件添加可听见的“滴答声”或“哔哔声”。
有人对如何做到这一点有任何想法吗?理想情况下,这将是一个简单的 for 循环,我会运行几百或几千个样本。
穷人的答案:找到滴答声或哔声的录音,然后在每个所需时刻将其与原始波形混合。您只需对哔声的值和哔声持续时间内的输入波形进行平均即可进行混合。
float * sample = first sample where beep is to be mixed in
float const beep_duration = desired beep duration in seconds
float const sample_rate = sampling rate in samples per second
float const frequency = desired beep frequency, Hz
float const PI = 3.1415926..
float const volume = desired beep volume
for( int index = 0; index < (int)(beep_duration * sample_rate); index++ )
{
sample[index] +=
sin( float(index) * 2.f * PI * sample_rate / frequency ) * volume;
}
找出您要在样本中插入刻度的位置(包括刻度的长度,因此这是一个范围,而不是一个点)。对波形的那一部分进行FFT 。将您想要的“滴答”声音的任何频率分量添加到频域表示中(最简单的就是单频音调)。对结果执行逆 FFT,瞧,您的音调已混合到原始信号中。我认为(自从我这样做以来已经有一段时间了)。