正如评论中某些人指出的,您要查看的是PCM audio。
简而言之,sound是在空气中传播的波浪。为了捕获该声音,我们使用microphone,它包含一个会随着声波撞击而振动的膜。这种振动转化为电信号,电压在此上升和下降。然后,通过ozt_a(ADC)通过每秒采样一定次数(“analog-to-digital converter”-44 KHz或每秒44,100个样本),将该电压变化转换为数字信号,并在当前情况下存储为脉冲编码调制(PCM)音频数据。
sampling rate相反。 PCM信号通过speaker(DAC)转换为模拟信号,然后模拟信号进入扬声器,在扬声器处使薄膜振动,从而在空气中产生振动并产生声音。
操纵音频
您可以使用许多语言库处理多种语言,但是您已将此问题标记为“与语言无关”,我将介绍一些简单的方法(据我所知!)能够以您喜欢的语言操作音频。
我将以伪代码呈现代码示例。
伪代码将使每个音频样本的幅度在-1到1的范围内。这将取决于您用于存储每个样本的数据类型。 (我之前没有处理过32位float
,所以可能有所不同。)
扩增
为了放大音频(因此,增加声音的音量),您需要使扬声器的振动更大,从而增加声波的强度。
为了使说话者移动得更多,您必须增加每个样本的值:
original_samples = [0, 0.5, 0, -0.5, 0]
def amplify(samples):
foreach s in samples:
s = s * 2
amplified_samples = amplify(original_samples)
// result: amplified_samples == [0, 1, 0, -1, 0]
现在将所得的样本放大2,并且在播放时,它的声音应该比以前大得多。
沉默没有振动时就没有声音。可以通过将每个样本降至0或任何特定值来实现静音,但样本之间的幅度没有任何变化:
original_samples = [0, 0.5, 0, -0.5, 0]
def silence(samples):
foreach s in samples:
s = 0
silent_samples = silence(original_samples)
// result: silent_samples == [0, 0, 0, 0, 0]
回放上述内容应该不会产生声音,因为由于样本中振幅的变化不大,扬声器上的膜片根本没有移动。
加快和降低可以通过两种方式来加快和降低速度:(1)更改回放采样率或(2)更改样本本身。
将播放采样率从44100 Hz更改为22050 Hz将使播放速度降低2。这将使声音变慢且音调降低。从22 KHz的信号源开始,以44 KHz的速度播放,声音将非常快且高音调,就像鸟鸣一样。
更改样本本身(并保持恒定的播放采样率)意味着(a)被丢弃或(b)被添加。
为了加快音频的播放速度,请丢弃样本:
original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5]
def faster(samples):
new_samples = []
for i = 0 to samples.length:
if i is even:
new_samples.add(samples[i])
return new_samples
faster_samples = faster(original_samples)
// result: silent_samples == [0, 0.2, 0.4]
上面程序的结果是音频将以2倍的速度加速,类似于播放以44 KHz在22 KHz采样的音频。
要减慢音频的播放速度,请输入一些示例:
original_samples = [0, 0.1, 0.2, 0.3]
def slower(samples):
new_samples = []
for i = 0 to samples.length:
new_samples.add(samples[i])
new_samples.add(interpolate(s[i], s[i + 1]))
return new_samples
slower_samples = slower(original_samples)
// result: silent_samples == [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3]
在此,添加了额外的样本,从而减慢了播放速度。在这里,我们有一个
interpolation
函数,该函数会“猜测”如何填充要添加的额外空间。
通过FFT进行频谱分析和声音修改使用称为
digital-to-analog converter(FFT)的技术,可以将幅度时域中的声音数据映射到频时域,以找出音频的频率分量。这可以用来产生您可能会在喜欢的音频播放器上看到的
Fast Fourier transform。
不仅如此,既然现在您可以更改音频的频率,就可以拥有音频的频率分量
如果要截止某些频率,则可以使用FFT将声音数据转换到频域,然后将不需要的频率分量归零。这称为
spectrum analyzers。
可以执行
filtering来允许高于特定频率的频率,如下所示:
data = fft(orignal_samples)
for i = (data.length / 2) to data.length:
data[i] = 0
new_samples = inverse_fft(data)
在上面的示例中,中途标记上的所有频率都被截止。因此,如果音频可以产生22 KHz作为最大频率,则超过11 KHz的任何频率都将被切除。 (对于以44 KHz播放的音频,可以产生的最大理论频率为22 KHz。请参见
high-pass filter。)
如果要进行诸如增加低频范围(类似于低音增强效果)之类的操作,请使用经过FFT转换的数据的低端并增加其幅度:
data = fft(orignal_samples)
for i = 0 to (data.length / 4):
increase(data[i])
new_samples = inverse_fft(data)
此示例增加了音频频率成分的下四分之一,导致低频变得更大。
可以对样本进行很多操作来操纵音频。继续尝试吧!这是最令人兴奋的学习方式。
祝好运!