实现思路
复习
(1)采样频率的概念:采样频率是指每秒钟采集音频数据的次数。例如:一个wav文件的采样频率是44100Hz,说明本文件每一秒钟采集了44100个数据点。然后每个数据点又与采样位数有关,比如当我们的采样位数是16位,则每个数据点的取值范围就是-32768~32767。当然,一个文件采样频率越高,采样位数越多,得到的音频文件效果也就会越好。
(2)采样定理(奈奎斯特采样定理):简单理解就是,采样时,采样的频率大于信号最高频率的两倍,之后就可以成功的完全恢复原本的信号。采样之后的数字信号完整地保留了原始信号中的信息。
实现思路
然后接下来我们想实现wav文件的采样频率的修改,从其概念来说,比如44100Hz要变为8000Hz,只需要原先每秒的44100个数据点变为8000个就可以了。这个叫做下采样,通过抽取的方式实现。与之对应的上采样,通过内插实现。
下面来说说我在网上查到的有关采样频率修改的资料:
1、采样频率修改又可以叫做音频重采样,相当于对原有的音频数据重新采样了一次。
2、我打算先去找个别人写好的关于wav文件采样率修改的软件,看看一般可以将wav采样率修改为多少比较合适。下载了一款名叫Cool Edit的软件,可以进行下面几种采样率的修改:
3、在一个http://www.pudn.com/上找到一些有关wav采样修改的代码,准备下载一些来看看别人怎么实现的。
首先来看看main.c中代码:
#include "StructData.h" //wav头文件结构体
#include "dsp_filter.h" //用到的滤波器头文件
#include <string.h>
#include <stdio.h>
int sampleRate=8000*UP/DOWN, bytelength=16; //AD(模拟转数字)采样频率及字长
//#define DOWN 5
//#define UP 3
short int Data_temp[IN_DATA_LEN*UP]={
0}; //临时数据
short int low_filter_dataout[IN_DATA_LEN*UP]={
0}; //低通滤波器数据输出
short int Out_data[IN_DATA_LEN*UP/DOWN]={
0}; // 输出data
short int In_data[IN_DATA_LEN]={
0}; //输入data,定为了150个数据点
short filter_coeff[FILTER_LEN]={
0}; //滤波器系数 #define FILTER_LEN 100
//wav文件头定义并初始化
struct RIFF_HEADER m_riff={
0};
struct FMT_BLOCK m_fmt={
0};
struct DATA_BLOCK m_data={
0};
void DSP_low_fir(short *x,short *y,short *h,int x_length,int hn) ; //DSP低通滤波器???
void main()
{
int i=0,j=0;
int data_length=0;
int total_data_length=0;
FILE *fp,*fwav;
/*
fp=fopen("coeff1.txt","r+");
for(i=0;i<92;i++) // 输入输出函数
{
fscanf(fp,"%lf",&coeff1[i]); //输入92个系数?
}
fclose(fp);
i=0;
fp=fopen("coeff2.txt","r+");
while(i<272) // 输入输出函数
{
fscanf(fp,"%lf",&coeff2[i++]);
}
fclose(fp);
*/
//将浮点的滤波器系数转化为定点数系数 (定点数:数据中小数点位置固定不变的数,编程容易实现,但需要考虑溢出)
for(i=0;i<FILTER_LEN;i++)
{
filter_coeff[i]=filter_coeff_float[i