音频重采样基础[音视频笔记]

Part 1:

先介绍最基本的一些概念:

1、何为音频:声音的存储,存储形式以及播放;

2、采样频率(rate):在一段音频上采样的频率,一般常用的为44.1kHz,音频最大的带宽20kHz,人耳能分辨的范围是20Hz~20kHz;

3、失真:传输音频数据过程中,由于将波音放大的时候造成数据缺失称之为失真;

4、频谱:频率谱密度的简称,是频率的分部曲线;

5、双声道:立体声,如果左右两个声道波形一样,可以人为制造一定的相位差,但差是个固定的,这为假立体声,只有左右两个声道波形完全不一样时才会形成立体声;

6、录单声道:由于录音时只有一个话筒,所以建议录音设置参数channels为1,如果录制双声道波形完全一样,则会造成浪费硬盘存储空间;

7、录立体声:使用两只话筒,通过不同位置进行采集;

8、在消除人声也就是伴唱模式的时候,由于Bass和鼓的相位较小,所以消声伴奏要做低频补偿;


Part 2:

PCM音频数据的存数方式

1、pcm数据按照互相交错格式存储:LRLRLRLR...具体会有两种:从小到大:little endian以及big endian从大到小,一般的wav格式文件都是按照little endian方式存储;

2、只有左耳有声音情况是一个声道的数据全是0,播放器可以将单声道渲染为双声道,但并不是真正意义上的双声道;

3、采样率跟存储没有区别,只有跟在存储空间大小有关系;

4、音频数据长度 = 秒数 X 采样率 X 桢长度 / 8;

5、WAV格式文件的大小计算公式:基于 44.1khz,16bit采样精度:Size = 44.1khz * 16bit *2(双声道) * time(歌曲时长)


Part 3:

音频设备文件简介:

音频编程接口实际上就是一组音频设备文件,通过它们可以从声卡中read/write,并控制声卡设置声道等参数;

1、/dev/sndstat:  usage: cat dev/sndstat,汇报当前声卡状态,检测声卡,不适用于程序中;

2、/dev/dsp: 是声卡用语数字采样(sampleing)和数字录音(captrueing)文件,以只读方式发开的话是输入声音,只写打开是输出声音。无论是向声卡写入还是输出声音,设备都具有默认的格式(format),默认为8rate、1ch、8khz,可以通过ioctl调用来改变这些参数值;

3、dev/audio:和2相同,同一个硬件上的不同软件接口;

4、/dev/mixer:应用程序操作混音器的软件接口,混音器将多个信号组成或者叠加,对混音器的编程包括如何设置控制增益器的级别,在不同的音源间切换,除了open和close

调用,其它操作都是由ioctl调用完成的,而且允许多个应用程序同时方位。

5、对声卡维护的内核缓冲区的修改:

int setting = 0xnnyy  , ioctl(handle,SND_DSP_SETFRAGMENT,&setting);

6、dev/snd/controlC0:用于声卡控制,如通道选择、混音、麦克风等控制;

7、dev/snd/midiC0D0:用于播放midi音频文件;

8、dev/snd/pcmC0D0c:用语录音的pcm设备接口;

9、dev/snd/pcmC0D0p:用语播放的pcm设备接口;

10、dev/snd/seq:音序器;

11、dec/snd/timer:定时器;

Part4:

1、音频重采样分为:采样的位数、采样的频率;

2、声音音质输出的质量主要取决于声卡模拟输入输出的品质,这跟CODEC转换品质有着重大关系;(CO:音频压缩,DEC:解压缩,CODEC:多媒体数字信号解码器)

3、SRC:改变信号的采样率,低采样率往高采样率转换时就是一个重采样的过程。

4、采样位数决定采样精度,如8bit是256个精度,16bit是64k个精度点。

5、WAV格式文件的大小计算公式:基于 44.1khz,16bit采样精度

Size = 44.1khz * 16bit *2(双声道) * time(歌曲时长)

6、一般由低位向高位进行重采样的时候最好是整数倍之间进行重采,否则容易造成失真等情况,例如 20khz往上重采样的时候可以选择 44.1、88、、、

如果低版本为24向上采样可选48、96、、、


Part5:

针对音频重采样API,这是我当时从其它网站找的相关开源算法:

API
speex_resampler_process_int()  单声道 16bit重采样
speex_resampler_process_float()  重采样浮点序列 (没用过)
speex_resampler_process_interleaved_float()   交叉的多通道浮点数据

demo

sr=16000;//原始采样率  
target_sr=44100;//重采样后采样率  
resampler = speex_resampler_init(1, sr, target_sr, 10, NULL);//初始化  
speex_resampler_skip_zeros(resampler);  
while (1)  
{  
    readed=fread(input,2,1600,fdr);  
    if (readed<=0)  
    {  
        break;  
    }  
    in_len=readed;   
    out_len=6400;//输出缓冲大小  
    speex_resampler_process_int(resampler, 0, input, &in_len,output, &out_len); //output传入缓冲大小,传出实际大小  
    fwrite(output,2,out_len,fdw);  
}  
speex_resampler_destroy(resampler);  

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/124991795