pcm
数据计算公式:
数据量Byte=采样频率Hz ×(采样位数/8)× 声道数 × 时间s
1)线性插值。只需通过插值计算来自两个最近邻居的期望时间索引的样本值。
2)使用脱机处理以2倍的倍数对样本表进行过采样,显然使存储器需求翻倍。在那些过采样的采样上使用相同的线性插值。
3)还可以使重采样器进程的音频采样速率加倍,使用半带低通滤波器和最后一个抽取级来回到音频回放速率。
4)不是线性插值而是使用短窗口的sinc
插值器。
def resample(data: bytes,
orig_sample_width: int,
orig_channels: int,
orig_sample_rate: int,
target_sample_rate: int):
'''
将多声道采样的音频数据,重采样到目标采样率的音频数据。信道和采样精度不改变,值改变采样率。
:param data 原始音频数据
:param orig_sample_width 原始采样精度
:param orig_channels 原始信道
:param orig_sample_rate 原始采样率
:param target_sample_rate 目标采样率
:return:
'''
if orig_sample_rate == target_sample_rate:
return data
ntype = numpy.int8 if 1 == orig_sample_width else numpy.int16
np_data = numpy.fromstring(data, ntype)
if orig_channels > 1:
np_data = np_data[::orig_channels]
orig_channels = 1
orig_len = len(np_data)
np_orgi_x = numpy.linspace(0, orig_len, orig_len)
f = scipy.interpolate.interp1d(np_orgi_x, np_data, 'cubic')
targ_len = target_sample_rate * orig_len / orig_sample_rate
np_targ_x = numpy.linspace(0, orig_len, targ_len)
np_targ_data = f(np_targ_x)
return np_targ_data.astype(ntype).tostring()