MelFrequencyFilterBank API 及Mel频率滤波器

来源:互联网 发布:php购物车源码 编辑:程序博客网 时间:2024/05/16 10:00







[java] view plain copy
print?
  1. <span style=“font-size:24px;”>本类的方法:  
  2. public void newProperties(PropertySheet ps);对属性进行改变时,调用,对属性的设置与构造方法的设置一样。对滤波器个数,最小频率,最大频率,logger。进行的设置。  
  3. public void initialize();在此方法中只调用了其父类相同的方法。即对本处理器的前一处理器进行了设置。  
  4. private double linToMelFreq(double inputFreq);把输入的线性频率转换为Mel域中的频率即mel频率。转换格式为:  
  5. 2595.0 * (Math.log(1.0 + inputFreq / 700.0) / Math.log(10.0))  
  6. private double melToLinFreq(double inputFreq);把输入的mel域的频率即mel频率转换为线性域的频率即线性频率。  
  7. private double setToNearestFrequencyBin(double inFreq, double stepFreq);stepFreq为频率间隔,在类中为频率间隔为输入的要进行滤波处理的频率轴上的频率间隔。本类的作用是确定infreq频率在频率轴上的位置(有多少个频率间隔如果个数是小数则去除小数取整)上所代表的频率,即频率间隔乘以其有多少个频率间隔。输出也频率值。此方法相当与对频率的量化处理。返回即为stepFreq * Math.round(inFreq / stepFreq);  
  8. private void buildFilterbank(int numberFftPoints, int numberFilters,double minFreq, double maxFreq);本方法作用为建立滤波器组。 通过输入参数:滤波器的个数,FFT的点数,滤波器组的最小频率和最大频率来建立滤波器组。在本方法中确定了频率轴上的频率间隔。此频率间隔为要进行滤波处理的信号频率轴的频率间隔为采样率除以FFT点数。本方法的实际上是在要进行滤波处理的频率轴上构建滤波器组,以便进行滤波。本方法构造的滤波器组为mel滤波器组,在滤波器组中的每个滤波器之间的可通过的mel频率为2倍的mel间隔距离。每一个滤波器的中心频率是其后一个滤波器的左边缘,是其前一个滤波器的右边缘。此滤波器组可以看成是一个mel滤波器通过每次移动一mel的间隔距离来实现。Mel间隔距离为滤波器组中的最大mel频率减去最小mel频率之后,再除以滤波器的个数加一后的值,即  deltaFreqMel = (maxFreqMel - minFreqMel) / (numberFilters + 1);其中的最大和最小mel频率是通过给定滤波器组中的最大和最小频率通过mel变换得来的。最后通过把mel滤波器中的mel频率转换成线性频率(每个mel滤波器中的中心,右边缘,左边缘mel频率转换成线性域中的中心,右边缘,左边缘频率)来构造每一个滤波器。通过调用了this.filter[i] = new MelFilter(leftEdge[i], centerFreq[i],rightEdge[i], initialFreqBin, deltaFreq);  
  9. private DoubleData process(DoubleData input);本方法通过输入的doubledata得到采样率和FFT的点数,并对输入的doubledata中的能量谱进行滤波处理,其结果放入一个长度为滤波器个数的double数组中,并根据此数组构建了一doubledata对象。返回此对象。  
  10. public Data getData();获得前一处理器的输出doubledata,并对其进行滤波器处理后,记录每一doubledata的处理时间,并输出后的数据。   
  11. </span>  

转:http://blog.csdn.net/taiyb/article/details/46350649

原创粉丝点击