简单的音频重采样

转载 2013年12月05日 19:19:05
Performance of audio resampling software:一些重采样的方法的测试比较

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 (< 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 (- Ystart); /* Return number of output samples */
}


音频重采样的实现

在声纹识别中,为了满足对不同采样率的要求,常需要对语音进行重采样。重采样即将原始的采样频率变换为新的采样频率以适应不同采样率的要求。实现重采样的传统方法有三种:一是若原模拟信号x(t)可以再生,或是已...
  • xiaozhuo12138
  • xiaozhuo12138
  • 2015年08月07日 14:09
  • 2351

音频重采样的基本(我的学习笔记)

Part 1: 先介绍最基本的一些概念: 1、何为音频:声音的存储,存储形式以及播放; 2、采样频率(rate):在一段音频上采样的频率,一般常用的为44.1kHz,音频最大的带宽20kHz,人耳能分...
  • hlj_include
  • hlj_include
  • 2016年08月05日 18:41
  • 3144

音频重采样原理及技术实现

转载请注明出处! 音频重采样作为一个独立模块蕴含了数字信号处理理论的多方面内容,综合起来其物理原理及滤波器的实现优化可以作为一个独立的项目做较深入的研究,可谓是一门学问。推荐大家研读国外作者的理论...
  • qiumingjian
  • qiumingjian
  • 2015年05月14日 20:14
  • 5303

音频重采样造成音质损失的原理

文章参考自http://www.pt80.net/thread-663924-1-1.html 1、WAV文件:采样率(Sample Rate),深度(bit-d...
  • u012362160
  • u012362160
  • 2015年11月05日 11:09
  • 2988

数字音频重采样

1. 什么是有限带宽插值(Bandlimited Interpolation)        在数字信号处理中,作用于离散时间信号的有限带宽插值是一个得到广泛应用的基本工具。一般而言,我们所面临的问题...
  • Augusdi
  • Augusdi
  • 2013年10月09日 17:13
  • 6075

ffmpeg实现音频resample(重采样)

用ffmpeg实现音频resample(重采样) 下面代码是实现将音频的三大要素:声道,样本,采样率变更的demo例如双声道变成单声道,44100->48000,float->s16等等。 int...
  • zhuweigangzwg
  • zhuweigangzwg
  • 2015年02月11日 14:30
  • 14514

FFMPEG学习【libavcodec】:音频重采样

一、函数 废弃:使用 libswresample代替 attribute_deprecated  ReSampleContext *  av_audio_resampl...
  • Explorer_day
  • Explorer_day
  • 2017年06月08日 15:21
  • 667

音频重采样

很多时候在播放音频时,音频的采样率、通道数等并不能满足我们播放得需求,这就需要我们对音频进行重采样。 FFmpeg提供的方法libswresample.a库为我们很好的解决重采样的问题,下面就对如何使...
  • u013346305
  • u013346305
  • 2015年09月23日 17:22
  • 1976

音频重采样函数

经验证,在ARMV4上32000/44100转8000hz采样率  效率不错. /* contributed by paul flinders */ void _x_audio_out_resampl...
  • lius1984
  • lius1984
  • 2009年06月26日 10:04
  • 2629

利用ALSA库进行音频重采样

一、ALSA介绍: 1、简介: 高级Linux声音体系(英语:Advanced LinuxSound Architecture,缩写为ALSA)是Linux内核中,为声卡提供的驱动组件,以替代原先的O...
  • mantis_1984
  • mantis_1984
  • 2016年10月17日 16:25
  • 1626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的音频重采样
举报原因:
原因补充:

(最多只允许输入30个字)