简单的音频重采样
2013-12-05 19:19
155 查看
Performance of audio resampling software:一些重采样的方法的测试比较
使用方法:如22050Hz-->8000Hz,参数为
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]; } |
_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; }
|
相关文章推荐
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
- iOS 最简单的OpenAL播放PCM实时音频
- 最简单的视音频播放示例2:GDI播放YUV, RGB
- 最简单的基于FFMPEG+SDL的音频播放器
- 最简单的视音频播放示例4:Direct3D播放RGB(通过Texture)
- 最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
- C#实现的一些音频,视频,简单动画效果
- 视频和音频播放的演示最简单的例子6:OpenGL广播YUV420P(T经exture,采用Shader)
- ANDROID音频系统散记之五:如何绕开多媒体音轨的重采样
- 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)
- 最简单的视音频播放示例2:GDI播放YUV, RGB
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- 最简单的视音频播放示例9:SDL2播放PCM
- iOS开发 简单实现视频音频的边下边播
- iOS开发 简单实现视频音频的边下边播
- 简单谈谈如何利用h5实现音频的播放
- 最简单的视音频播放示例9:SDL2播放PCM