📄 melbankm.c
字号:
#include "stdio.h"
#include "math.h"
#define pi 3.1415926
#define filterNum 24
#define frameSize 512
#define fs 22050 //采样频率
//#include "melbankm.c"
/*
本程序是为了测试三角滤波器组产生的系数是否正确
*/
void melbankm(void)
{
//#pragma DATA_SECTION(matrixmel, ".melarea")
//#pragma DATA_SECTION(matrix_index, ".melarea")
float matrixmel[filterNum+1][55];//当滤波器个数为24时,最多的一个占用(256-202)个mel频率点
short int matrix_index[filterNum+2];
short int start[filterNum+1],center[filterNum+1],stop[filterNum+1];
short int fh= 0.5*fs;
float maxmelfreq=1127*log(fh/700.0+1);
float sideWidth=(float)maxmelfreq/(filterNum+1);//MEL频率的节距
int index=0;
puts("开始产生Mel三角滤波器组系数。。。。。。\n");
for(index=0;index<filterNum+2;index++)//共有fiterNum+2个节点,每个滤波器占用3个
{
float j=0;
j=700*(exp(index*sideWidth/1127.0)-1)/fs*frameSize;
matrix_index[index]=(int)(j)+1;//存放MEL频率点,共有frameSize/2个
// printf("matrix_index[%d]=%d\n",index,matrix_index[index]);
}
for(index=1;index<=filterNum;index++)//滤波器组下标从1开始,直到filterNum
{
start[index]=matrix_index[index-1];//start,center,stop下标对应滤波器组号,即从1开始
center[index]=matrix_index[index];//存放滤波器组的相应开始、中间、结束点的MEL频率
stop[index]=matrix_index[index+1];
}
for(index=1;index<=filterNum;index++)//给每个滤波器中的各点给值
{
int k=0,i=0;
for (k=start[index],i=0;k<=center[index];k++,i++)
{ matrixmel[index][i] = (k-start[index])/(float )(center[index]-start[index]);
// printf("matrixmel[%d][%d]=%f\n",index,i,matrixmel[index][i]);
}
//matrixmel[index][i]存放:index表示第index个三角滤波器,i=0表示存放这个滤波器
//的开始点的MEL频率(是均匀分布的)
//matrixmel[0][i]不存放数
for (k=center[index]+1;k<=stop[index];k++,i++)
{ matrixmel[index][i]= 1-(k-center[index])/(float )(stop[index]-center[index]);
// printf("matrixmel[%d][%d]=%f\n",index,i,matrixmel[index][i]);
//一定要加float转换,不然只会产生整数,没有小数
}
}
puts("Mel三角滤波器组系数已生成。\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -