java pcm 重采样_音频重采样与PCM音量调节最后代码

#include "resample.h"#include #include #include #include #define FRAC_BITS16#define FRAC(1 << FRAC_BITS)#define av_free(p){if(p) free(p);}#define av_malloc(size)malloc(size)/////////////////////...
摘要由CSDN通过智能技术生成

#include "resample.h"

#include

#include

#include

#include

#define FRAC_BITS16

#define FRAC(1 << FRAC_BITS)

#define av_free(p){if(p) free(p);}

#define av_malloc(size)malloc(size)

//

// Construction/Destruction

//

CResample::CResample()

{

}

CResample::~CResample()

{

}

// 8bit_to_16bit(注意:输出数据是有符号的还是无符号的)

// output:   para 1: 16bit的数据

// input:    para 2: 8bit数据

//           para 3: 要转换数据的次数,为原数据长度,

//注:因为一次转换1个字节变两个字节,所以转换后数据的总长度为8位数据的两倍

int CResample::mono_8bit_to_16bit(short* lp16bits, unsigned char* lp8bits, int len)

{

int i=0;

for(i=0; i

*lp16bits++ = ((*lp8bits++) -128) << 8;

}

return i<<1;

}

void CResample::init_mono_resample(ReSampleChannelContext *s, float ratio)

{

ratio = (float)(1.0 / ratio);

s->iratio = (int)floorf(ratio);

if (s->iratio == 0)

s->iratio = 1;

s->incr = (int)((ratio / s->iratio) * FRAC);

s->frac = FRAC;

s->last_sample = 0;

s->icount = s->iratio;

s->isum = 0;

s->inv = (FRAC / s->iratio);

}

/* fractional audio resampling */

int CResample::fractional_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)

{

unsigned int frac, incr;

int l0, l1;

short *q, *p, *pend;

l0 = s->last_sample;

incr = s->incr;

frac = s->frac;

p = input;

pend = input + nb_samples;

q = output;

l1 = *p++;

for(;;) {

/* interpolate */

*q++ = (l0 * (FRAC - frac) + l1 * frac) >> FRAC_BITS;

frac = frac + s->incr;

while (frac >= FRAC) {

frac -= FRAC;

if (p >= pend)

goto the_end;

l0 = l1;

l1 = *p++;

}

}

the_end:

s->last_sample = l1;

s->frac = frac;

return q - output;

}

int CResample::integer_downsample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)

{

short *q, *p, *pend;

int c, sum;

p = input;

pend = input + nb_samples;

q = output;

c = s->icount;

sum = s->isum;

for(;;) {

sum += *p++;

if (--c == 0) {

*q++ = (sum * s->inv) >> FRAC_BITS;

c = s->iratio;

sum = 0;

}

if (p >= pend)

break;

}

s->isum = sum;

s->icount &#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值