(LFPCM × Convert)重采样算法

好的,我成功的在这上面花费了3天

Hanako的音调变换算法(非专业,大佬轻喷)

我将一个采样叫做LFPCM,64位浮点数

#define LFPCM double

首先这里有一些采样:

在这里插入图片描述
我们希望将它的频率变为原来的p倍:

在这里插入图片描述
(很明显,时域变长了)

如果将时域压缩回原来的样子:

在这里插入图片描述

那么我们能否通过更改采样间隔来实现改变音高呢?

可以,但是怎么采样呢?

最简单的近似办法便是将两个采样用线连起来。

在两个采样的时间间隔很短时,可以近似的认为它们之间的采样是按直线排列的
在这里插入图片描述
那么

    double offset = 0, k, b, x;
	for (; offset < (double)tmp.size()-1; offset += power) {
		x = offset - (double)((size_t)offset);
		b = tmp[(size_t)offset];
		k = tmp[(size_t)offset + 1] - b;
		wave.push_back(k * x + b);
	}

假设两个采样之间的间隔为1,新采样间隔为power
x是距离该区域左端(b)采样的长度(区域长度为旧采样间隔,1),
k是比例


源代码
void ConvertFreq(std::vector<LFPCM> &wave, double power) {
	if (power < 0)return;
	if (power == 0) {
		for (size_t i = 0; i < wave.size(); i += 1)wave[i] = 0;
		return;
	}
	std::vector<LFPCM> tmp(wave);
	tmp.push_back(wave[0]);

	wave.clear();

	double offset = 0, k, b, x;
	for (; offset < (double)tmp.size()-1; offset += power) {
		x = offset - (double)((size_t)offset);
		b = tmp[(size_t)offset];
		k = tmp[(size_t)offset + 1] - b;
		wave.push_back(k * x + b);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
swr_convert是一个音频重采样函数,用于将一个音频流从一个采样率转换为另一个采样率。在音频处理过程中,有时候需要将音频流的采样率进行转换,以适应不同的播放设备或需求。 swr_convert函数的使用步骤如下: 1. 创建一个SwrContext结构体对象,并进行初始化。 2. 设置输入音频流的相关参数,包括采样率、采样格式、声道布局等。 3. 设置输出音频流的相关参数,包括目标采样率、目标采样格式、目标声道布局等。 4. 使用swr_convert函数进行采样率转换,将输入音频数据转换为输出音频数据。该函数需要传入输入缓冲区、输出缓冲区、以及输入音频数据的采样个数。 5. 根据需要,可以使用swr_get_out_samples函数获取实际输出采样个数。 6. 转换完成后,可以释放SwrContext结构体对象。 在进行音频采样率转换时,需要注意目标采样率是否合理,以免发生音质损失或其他问题。同时,还需要注意输入和输出音频流的采样格式和声道布局的匹配,以保证能够正确进行转换。在使用swr_convert函数时,还可以设置一些其他参数,如重采样质量、重采样阶段等,以控制转换过程的效果。 总之,swr_convert函数是一个用于音频重采样的功能强大的函数,能够方便地将音频流的采样率进行转换,满足不同设备或需求的要求。在使用时需要注意参数设置和采样格式匹配,以保证转换结果的质量和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值