mel滤波器算法设计
来源:互联网 发布:linux 卸载安装包 编辑:程序博客网 时间:2024/05/21 08:44
什么是mel滤波器呢?mel滤波器是在mel频率上均匀分布的三角滤波器
mel频率与时域频率之间的关系是:
me滤波器在mell频率上均匀分布,那么他的带宽是:
知道了中心平率,可以换算成时域频率:
mel滤波器的传递函数如下:
实现代码如下:
#ifndef MEL_H
#define MEL_H
#include <QString>
void output(const QString & name,double *d,int size);
class CMel
{
public:
CMel();
int mel(double *data,int size);
protected:
void filtter(double d, double * powerSample);
private:
};
#endif // MEL_H
#include "Mel.h"
#include <math.h>
#include <memory.h>
#include <QDebug>
#define FILTTER_NUM 25
//滤波器的中心频率,最大8khz
const int FiltFreq[FILTTER_NUM+1] = {0,100,200,300,400,500,600,700,800,900,
1000,1149,1320,1516,1741,2000,2297,2639,3031,3482,
4000,4595,5278,6063,6964,8001};
//滤波器的带宽
const int BW[FILTTER_NUM+1]={100,100,100,100,100,100,100,100,100,100,
124,160,184,211,242,278,320,367,422,484,
556,639,734,843,969,1112};
void output(const QString & name,double *d,int size)
{
QDebug &out = qDebug();
out << name << " ";
for(int i=0; i<size; i++)
{
out << d[i];
}
}
CMel::CMel()
{
}
int CMel::mel(double *data,int size)
{
//处理滤波
double *powerSamp = new double[FILTTER_NUM + 1];
memset(powerSamp,0,FILTTER_NUM*sizeof(double));
for(int i=0; i<size; i++)
{
filtter(data[i],powerSamp);
}
//拷贝结果数据
for(int i=0;i<FILTTER_NUM;i++)
{
data[i]= powerSamp[i];
}
delete[] powerSamp;
return FILTTER_NUM;
}
void CMel::filtter(double d, double * powerSample)
{
//一个频点,必点包含在上个滤波器的右半部和下个滤波器的左半部
for(int i = 0; i<FILTTER_NUM;i++)
{
if(d > FiltFreq[i] && d < FiltFreq[i+1])
{
//右半部分
double filterpara = 1 - (d-i*BW[i])/BW[i];
filterpara += powerSample[i];
powerSample[i]=filterpara;
//左半部分
filterpara = 1 + (d-i*BW[i+1])/BW[i+1];
filterpara += powerSample[i+1];
powerSample[i+1]=filterpara;
}
}
}
这个算法,参照了网上的一个算法,将mel频率域的计算转换的时域计算,转换的关键就在cpp文件的开头定义的每个摩尔滤波器的中中频率对应的时域中心频率列表和每个滤波器的带宽列表。
0 0
- mel滤波器算法设计
- MelFilter API 及mel 滤波器
- MelFilter API 及mel 滤波器
- MelFrequencyFilterBank API 及Mel频率滤波器
- MelFrequencyFilterBank API 及Mel频率滤波器
- 滤波器设计
- 滤波器设计
- 滤波器设计
- 算法的verilog实现-FIR滤波器的设计实现
- 滤波器设计软件
- 脉冲成形滤波器设计
- 滤波器的设计
- 滤波器的设计
- FilterPro之滤波器设计
- RFSim99之滤波器设计
- 各种滤波器的设计
- 滤波器设计软件
- 利用FilterDesigner设计滤波器
- javascript实现的简单图片左右切换
- n个元素任意依次入栈出栈,共有几种出栈序列
- .\output\ucosII.axf: Error: L6218E: Undefined symbol OS_StrLen (referred from os_task.o).
- c++排序算法——冒泡排序
- SSL握手过程
- mel滤波器算法设计
- SEH异常处理学习总结
- Memcache函数详解
- 基于haswell CPU的几种平台框架总结
- emgucv下载与安装
- 宏定义学习(1)
- Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理 总结
- 谁获得了最高奖学金
- Php 中文unicode转换