一辆汽车有一种懒散的声音。我想通过改变音符来加速和降低这种声音。如何才能做到这一点。我只懂C和一点C++。
发布于 2020-09-16 12:41:47
从原始音频array1的空闲声音数组开始,这将处于时间域中。
将此array1输入到FFT调用中,该调用将返回一个新的数组array2,该数组将作为与array1相同的底层数据的频域表示形式。在这个新的数组array2中,零元素表示零赫兹,而分隔每个元素的freq增量(incr_freq)是由源声音array1 parms定义的。
incr_freq := sample_rate / number_of_samples_in_array1..。array2的每个元素的值都是一个复数,您可以从中计算给定的freq的大小和相位。为了使array2的频率变得清晰,基于单元位置,从零开始,这是直流偏置,可以忽略。了解上面的频率增量(incr_freq),让我们展示array2的前几个元素
complex_number_0 := array2[0] // element 0 DC bias ignore this element
// its frequency_0 = 0
complex_number_1 := array2[1] // element 1
// its at frequency1 = frequency_0 + incr_freq
complex_number_2 := array2[2] // element 2
// its at frequency2 = frequency_1 + incr_freq现在确定array2 (nugget1)中最高的X值.这些占主导地位的频率对捕捉汽车声音的本质最负责.我们为X元素保存array2的元素值以供以后使用.我们使用下面的值计算震级,这是array2所有元素的内部循环。
for index_fft, curr_complex := range complex_fft {
curr_real = real(curr_complex) // pluck out real portion of imaginary number
curr_imag = imag(curr_complex) // ditto for imaginary part of complex number
curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples_array2
// ... more goodness here
}现在,将array2 FFT数组输入一个反向FFT调用,该调用将在时域(原始音频)中再次返回数组array3。
如果您不更改array2的数据,您的array3将与array1相同(近似为一级).现在启动您的array2,在将其发送到逆FFT调用之前,先传递acc或dec。
如何改变array2的秘诀是作为一种练习.我的猜测是把一个循环,你的合成array3从array2,它会立即呈现给您的扬声器在这个循环(loop_secret_sauce) .其中,您增加(acc)或减少(12月)的最高X频率,如上述识别为nugget1 .这意味着作为一个整体的移动,所有最高的X频率的全部频率集,如其大小定义的.给出X频率的这组偏移的一个非线性方面.可能不仅会增加或降低这个集合的频率,而且还可能与它们的相对大小有关,并在这个循环中引入一个更宽的频率样本。
让你自己把这个秘密的酱油作为array1使用几种不同的记录,当它在空闲或acc或dec时,并比较它的array2和使用空闲,acc,dec之间的差别在这个酱油循环中。
在这里我们钻研机械..。当源音频空闲时,我们遍历它的array2并确定array2的最上面的X元素。这些array2的X元素被保存到数组top_mag_idle中.对acc的源音频做同样的操作,并保存在数组top_mag_acc中.关键一步..。检查存储在top_mag_idle和top_mag_acc中的元素之间的差异。top_mag_idle元素到top_mag_acc元素之间的这种转换是你的秘方,你将把它放入loop_secret_sauce .要想在这里获得具体信息,当您在loop_secret_sauce中循环并更新array2元素以反映top_mag_idle时,当您继续在array2上循环以合成array3和过渡到更新array2元素以反映top_mag_acc时,音频将随着时间的推移而变得空闲。
也许为了获得对秘密酱汁的直觉,考虑一下.想象一下听一辆闲置的车..。与任何产生音频的复杂系统一样,它将有一组主导频率,这意味着有一组不同的频率,比如5种不同的频率,最大的频率(最响亮的频率)。就像钢琴家在钢琴上弹奏琴弦一样,她的手和手指的形状保持不变,但她却反复敲击键盘。现在汽车开始加速..。这里的类比是,她继续用相同的静态手和手指布局反复敲击键盘,但现在她继续点击键盘时,她的手滑到了右边。在loop_secret_sauce内部的代码中,当您从array2合成array3时,原始的一组频率(top_mag_idle)将产生空闲的汽车声音。然后,要实现acc,您可以同时增加top_mag_idle中的所有频率,并从array2重复合成array3,这将给您带来acc的声音。
在你完成这项工作之前,我只使用单声道(不是立体声)。
听起来是个有趣的项目..。玩得开心!
https://stackoverflow.com/questions/63913964
复制相似问题