您的当前位置:首页正文

音频重采样

2024-12-02 来源:个人技术集锦

音频重采样

计算公式

pcm 数据计算公式:

数据量Byte=采样频率Hz ×(采样位数/8)× 声道数 × 时间s

bytes=samplerate×(samplewidth÷8)×channels×time b y t e s = s a m p l e r a t e × ( s a m p l e w i d t h ÷ 8 ) × c h a n n e l s × t i m e

time=bytes÷(samplerate×channels×samplewidth)×8 t i m e = b y t e s ÷ ( s a m p l e r a t e × c h a n n e l s × s a m p l e w i d t h ) × 8

重采样策略

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()
显示全文