请读者先阅读 梅尔滤波器组的分析与设计思路、 基于matlab的梅尔滤波器组的设计。
基于FFT点数设计梅尔滤波器组
#include<stdio.h>
#include<math.h>
#define M 24
#define fs 8000
int main()
{
int fl = 0, fh = fs/2, N = 256;
double F_mel_fl = 1125*log(1+fl/700.0);
double F_mel_fh = 1125*log(1+fh/700.0);
double Mel[24+2], f[24+2], H[256/2+1];
int n[24+2];
double df = 1.0*fs/N; //计算频率分辨率
int i, m, k;
for(i=0; i<=M+1; i++)
Mel[i]=F_mel_fl + 1.0*i*((F_mel_fh-F_mel_fl)/(M+1)); //将F_mel_fl至F_mel_fh的Mel频率范围均分为M+1段,产生M+2个Mel频率值
for(i=0; i<=M+1; i++)
f[i] = 700*(exp(Mel[i]/1125.0)-1); //分别求出这M+2个Mel频率对应的实际频率值
for(i=0; i<=M+1; i++)
n[i] = ceil(1.0*f[i]/df); //分别求出这M+2个实际频率值对应的FFT点数
for(m=1; m<=M; m++)
{
for(k=0; k<=N/2+1; k++)
{
if(k>=n[m-1] && k<n[m])
H[k] = 1.0*(k-n[m-1])/(n[m]-n[m-1]);
else if(k>=n[m] && k<=n[m+1])
H[k] = 1.0*(n[m+1]-k)/(n[m+1]-n[m]);
else
H[k] = 0;
}
for(k=0; k<=N/2; k++)
printf("%f\t%f\n", k*df, H[k]);
}
}
基于频率设计梅尔滤波器组
#include<stdio.h>
#include<math.h>
#define M 24
#define fs 8000
int main()
{
int fl = 0, fh = fs/2;
double F_mel_fl = 1125*log(1+fl/700.0);
double F_mel_fh = 1125*log(1+fh/700.0);
double Mel[24+2], f[24+2], H[4000+1];
int i, m, k;
for(i=0; i<=M+1; i++)
Mel[i]=F_mel_fl + 1.0*i*((F_mel_fh-F_mel_fl)/(M+1)); //将F_mel_fl至F_mel_fh的Mel频率范围均分为M+1段,产生M+2个Mel频率值
for(i=0; i<=M+1; i++)
f[i] = 700*(exp(Mel[i]/1125.0)-1); //分别求出这M+2个Mel频率对应的实际频率值
for(m=1; m<=M; m++)
{
for(k=0; k<=fh; k++)
{
if(k>=f[m-1] && k<f[m])
H[k] = 1.0*(k-f[m-1])/(f[m]-f[m-1]);
else if(k>=f[m] && k<=f[m+1])
H[k] = 1.0*(f[m+1]-k)/(f[m+1]-f[m]);
else
H[k] = 0;
}
for(k=0; k<=fh; k++)
printf("%d\t%f\n", k, H[k]);
}
}