简单的音频重采样
来源:互联网 发布:java适配器是什么 编辑:程序博客网 时间:2024/06/01 08:52
void _x_audio_out_resample_mono(short* input_samples, int in_samples,
short* output_samples, int out_samples)
{
int osample;
/* 16+16 fixed point math */
uint32_t isample = 0;
uint32_t istep = ((in_samples-2) << 16)/(out_samples-2);
#ifdef VERBOSE
printf ("Audio : resample %d samples to %d\n",
in_samples, out_samples);
#endif
for (osample = 0; osample < out_samples - 1; osample++) {
int s1;
int s2;
int16_t os;
uint32_t t = isample&0xffff;
/* don't "optimize" the (isample >> 16)*2 to (isample >> 15) */
s1 = input_samples[(isample >> 16)];
s2 = input_samples[(isample >> 16)+1];
os = (s1 * (0x10000-t)+ s2 * t) >> 16;
output_samples[osample] = os;
isample += istep;
}
output_samples[out_samples-1] = input_samples[in_samples-1];
}
使用方法:
如22050Hz-->8000Hz,参数为
_x_audio_out_resample_mono(inbuf, in_sample_num, outbuf, in_sample_num*8000/(22050*2));
inbuf为待采样音频,outbuf为输出缓存,保证尺寸不小于
in_sample_num*8000/(22050*2)
。
另一个函数,比上面的效果要好。
typedef short HWORD;
typedef int WORD;
typedef unsigned int UWORD;
typedef unsigned short UHWORD;
#define MAX_HWORD (32767)
#define MIN_HWORD (-32767)
#define Np 15
#define Pmask ((1<<Np)-1)
static inline HWORD WordToHword(WORD v, int scl)
{
HWORD out;
WORD llsb = (1<<(scl-1));
v += llsb; /* round */
v >>= scl;
if (v>MAX_HWORD) {
#ifdef DEBUG
if (pof == 0)
fprintf(stderr, "*** resample: sound sample overflow\n");
else if ((pof % 10000) == 0)
fprintf(stderr, "*** resample: another ten thousand overflows\n");
pof++;
#endif
v = MAX_HWORD;
} else if (v < MIN_HWORD) {
#ifdef DEBUG
if (nof == 0)
fprintf(stderr, "*** resample: sound sample (-) overflow\n");
else if ((nof % 1000) == 0)
fprintf(stderr, "*** resample: another thousand (-) overflows\n");
nof++;
#endif
v = MIN_HWORD;
}
out = (HWORD) v;
return out;
}
static int
SrcLinear(HWORD X[], HWORD Y[], double factor, UWORD *Time, UHWORD Nx)
{
HWORD iconst;
HWORD *Xp, *Ystart;
WORD v,x1,x2;
double dt; /* Step through input signal */
UWORD dtb; /* Fixed-point version of Dt */
UWORD endTime; /* When Time reaches EndTime, return to user */
dt = 1.0/factor; /* Output sampling period */
dtb = dt*(1<<Np) + 0.5; /* Fixed-point representation */
Ystart = Y;
endTime = *Time + (1<<Np)*(WORD)Nx;
while (*Time < endTime)
{
iconst = (*Time) & Pmask;
Xp = &X[(*Time)>>Np]; /* Ptr to current input sample */
x1 = *Xp++;
x2 = *Xp;
x1 *= ((1<<Np)-iconst);
x2 *= iconst;
v = x1 + x2;
*Y++ = WordToHword(v,Np); /* Deposit output */
*Time += dtb; /* Move to next sample by time increment */
}
return (Y - Ystart); /* Return number of output samples */
}
- 简单的音频重采样
- 音频重采样的实现
- 音频重采样函数
- 音频重采样
- ffmepg音频重采样
- 音频重采样
- 音频重采样
- ffmpeg音频重采样分析
- 音频重采样到双声道
- 音频重采样问题总结
- 音频重采样的基本(我的学习笔记)
- 音频重采样造成音质损失的原理
- 音频重采样(libavfilter)及AVAudioFifo的使用
- FFmpeg swr_convert 音频重采样,编码的噪音问题
- ffmpeg实现音频resample(重采样)
- 音频重采样原理及技术实现
- ffmpeg实现音频resample(重采样)(二)
- ffmpeg实现音频resample(重采样)
- oracle主键自增长
- Ubuntu1204 安装深度音乐 + 百度音乐插件
- HTML与XML的区别联系
- Kindergarten Counting Game
- linux网络编程之socket(2):select函数的并发限制和 poll 函数应用举例
- 简单的音频重采样
- 成绩排名
- hdu1003
- JAVA中的指针,引用及对象的clone
- jsp 中 request跳转和response 跳转
- C++ Primer 学习笔记 (一)
- VS关闭没用的warning
- Hibernate4报错java.lang.NullPointException, JdbcServiceImpl.configure(JdbcServiceImpl.java:207)
- 第十章 预习