c语言语音分帧加窗例子
时间: 2023-06-03 18:07:48 浏览: 55
很好的问题!以下是一个简单的 C语言语音分帧加窗的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926535897932384626433832795 //定义π值
int main()
{
int i,j,N=256,frame_len=25,frame_shift=10,sample_rate=16000; //定义相关参数
float w[N],x[N],X[N/2+1];
//w:窗函数,x:输入的音频信号,X:每帧对应的FFT系数
for(i=0;i<N;i++)
{
w[i]=0.54-0.46*cos(2*PI*i/(N-1)); //定义汉明窗
}
FILE *fp;
fp=fopen("test.pcm","rb"); //读入二进制文件
if(fp==NULL) //文件读取失败
{
printf("File open failed!\n");
exit(0);
}
fseek(fp,0L,SEEK_END); //把文件指针移到文件末尾
int pcmLength=ftell(fp); //获取文件长度
int frameLength=frame_len*sample_rate/1000; //计算每帧的采样点数
int frameShift=frame_shift*sample_rate/1000; //计算帧移量
int frameNum=floor((pcmLength-frameLength)/frameShift+1); //计算帧的总数
int cnt=0; //定义循环计数器
for(i=0;i<frameNum;i++)
{
memset(x,0,sizeof(x)); //初始化数组
for(j=0;j<frameLength;j++)
{
x[j]=fgetc(fp); //读入音频数据
x[j]/=32767.0; //归一化
}
for(j=0;j<frameLength;j++)
{
x[j]*=w[j]; //加汉明窗
}
//执行FFT变换
fft(x,X,N);
//去掉FFT系数中的幅值,只保留相角信息
for(j=0;j<N/2+1;j++)
{
X[j]=arg(X[j]); //求取相角
}
//以上部分可以根据需要进行调整
cnt++;
}
fclose(fp); //关闭文件
return 0;
}
```
希望可以对您有帮助。